     1                                  ; ****************************************************************************
     2                                  ; clock.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'clock.s')
     3                                  ; ---------------------------------------------------------------------------
     4                                  ; CLOCK.PRG ! TEST program !
     5                                  ; TRDOS 386 date & time interrupt test program (by Erdogan Tan)
     6                                  ;
     7                                  ; 28/05/2016
     8                                  ;
     9                                  ; [ Last Modification: 31/05/2016 ]
    10                                  ;
    11                                  ; ****************************************************************************
    12                                  
    13                                  [BITS 32]
    14 00000000 BE[10010000]                    mov     esi, prg_msg
    15 00000005 E8F2000000              	call	print_msg
    16                                  
    17 0000000A B400                    	mov 	ah, 0   ; set video mode
    18 0000000C B003                    	mov 	al, 3   ; 80x25 text mode, CGA colors
    19 0000000E CD31                    	int	31h     ; TRDOS 386 video interrupt
    20                                  			; (IBM PC/AT ROMBIOS, INT 10h) 
    21                                  rtc_p_next:
    22                                  	; Check keyboard buffer
    23 00000010 B411                    	mov	ah, 11h
    24 00000012 CD32                    	int 	32h ; TRDOS 386 keyboard interrupt
    25                                  		    ; (IBM PC/AT ROMBIOS, INT 16h)			
    26 00000014 741E                    	jz	short rtc_p ; keyboard buffer empty
    27                                  
    28 00000016 E8DC000000              	call	getch
    29 0000001B 3C1B                    	cmp	al, 1Bh
    30 0000001D 7715                    	ja	short rtc_p
    31                                  
    32                                  terminate:
    33 0000001F B801000000              	mov	eax, 1	; 'sysexit'
    34 00000024 CD40                    	int	40h	; TRDOS 386 system call
    35                                  hang:
    36 00000026 90                      	nop
    37 00000027 90                      	nop
    38 00000028 90                      	nop
    39 00000029 EBFB                    	jmp	short hang
    40                                  
    41                                  bcd_to_ascii:
    42                                  	; INPUT ->
    43                                  	;	AL = Packed BCD number
    44                                  	; OUTPUT ->
    45                                  	;	AX = ASCII word/number
    46                                  	;
    47 0000002B D410                    	db	0D4h, 10h	; Undocumented inst. AAM
    48                                  				; AH = AL / 10h
    49                                  				; AL = AL MOD 10h
    50 0000002D 660D3030                	or	ax, '00'	; Make it ASCII based
    51 00000031 86E0                            xchg	ah, al 
    52 00000033 C3                      	retn	
    53                                  
    54                                  rtc_p:
    55                                  	; Set cursor position
    56 00000034 6631D2                  	xor	dx, dx  ; row 0, column 0
    57 00000037 30FF                    	xor	bh, bh  ; Video page 0
    58 00000039 B402                    	mov	ah, 2	; set cursor position
    59 0000003B CD31                    	int	31h 	; TRDOS 386 video interrupt
    60                                  
    61                                  	; Print Real Time Clock content
    62                                  	;
    63 0000003D B402                    	mov	ah, 2	; read the time
    64 0000003F CD35                    	int	35h	; TRDOS 386 date&time interrupt
    65 00000041 72DC                    	jc	short terminate
    66                                  
    67 00000043 3A35[A4010000]          	cmp	dh, [time_second]
    68 00000049 74C5                            je      short rtc_p_next
    69                                  	
    70 0000004B 8835[A4010000]                  mov     [time_second], dh
    71                                          ;mov    [time_minute], cl
    72                                          ;mov    [time_hour], ch
    73 00000051 66890D[A5010000]                mov     [time_minute], cx
    74                                  	;
    75 00000058 B404                    	mov	ah, 4	; read the date
    76 0000005A CD35                    	int	35h	; TRDOS 386 date&time interrupt
    77                                  			; (IBM PC/AT ROMBIOS, INT 1Ah)
    78 0000005C 72C1                            jc      short terminate
    79                                  
    80                                  	;mov	[date_day], dl
    81                                  	;mov	[date_month], dh
    82 0000005E 668915[A0010000]        	mov	[date_day], dx
    83                                  	;mov	[date_year], cl
    84                                  	;mov	[date_century], ch
    85 00000065 66890D[A2010000]        	mov	[date_year], cx
    86                                  	;
    87 0000006C A0[A3010000]            	mov	al, [date_century]
    88 00000071 E8B5FFFFFF              	call	bcd_to_ascii
    89 00000076 66A3[90010000]          	mov	[datestr+6], ax
    90 0000007C A0[A2010000]            	mov	al, byte [date_year]
    91 00000081 E8A5FFFFFF              	call	bcd_to_ascii
    92 00000086 66A3[92010000]          	mov	[datestr+8], ax
    93 0000008C A0[A1010000]            	mov	al, byte [date_month]
    94 00000091 E895FFFFFF              	call	bcd_to_ascii
    95 00000096 66A3[8D010000]          	mov	[datestr+3], ax
    96 0000009C A0[A0010000]            	mov	al, byte [date_day]
    97 000000A1 E885FFFFFF              	call	bcd_to_ascii
    98 000000A6 66A3[8A010000]          	mov	[datestr], ax
    99                                  	;
   100 000000AC A0[A6010000]                    mov     al, byte [time_hour]
   101 000000B1 E875FFFFFF              	call	bcd_to_ascii
   102 000000B6 66A3[96010000]          	mov	[timestr], ax
   103 000000BC A0[A5010000]                    mov     al, byte [time_minute]
   104 000000C1 E865FFFFFF              	call	bcd_to_ascii
   105 000000C6 66A3[99010000]          	mov	[timestr+3], ax
   106 000000CC A0[A4010000]                    mov     al, byte [time_second]
   107 000000D1 E855FFFFFF              	call	bcd_to_ascii
   108 000000D6 66A3[9C010000]          	mov	[timestr+6], ax
   109                                  	;		
   110 000000DC BB[78010000]            	mov	ebx, rtc_msg ; message offset
   111 000000E1 B9FF000000              	mov	ecx, 255 ; message length 
   112 000000E6 BA0F000000              	mov	edx, 0Fh ; white color
   113 000000EB B823000000              	mov	eax, 35  ; 'sysmsg'
   114 000000F0 CD40                    	int	40h	 ; TRDOS 386 system call
   115                                  
   116 000000F2 E919FFFFFF              	jmp	rtc_p_next  
   117                                  
   118                                  getch:
   119                                  	; Getchar by using keyboard interrupt
   120 000000F7 B410                    	mov	ah, 10h
   121 000000F9 CD32                    	int 	32h ; TRDOS 386 keyboard interrupt
   122                                  		    ; (IBM PC/AT ROMBIOS, INT 16h)			
   123 000000FB C3                      	retn
   124                                  
   125                                  print_msg:
   126 000000FC 66BB0700                	mov	bx, 7
   127 00000100 B40E                            mov     ah, 0Eh
   128                                  pmsg_loop:
   129 00000102 AC                      	lodsb
   130 00000103 20C0                    	and	al, al
   131 00000105 7404                    	jz	short pmsg_ok
   132 00000107 CD31                    	int	31h	; TRDOS 386 video interrupt
   133 00000109 EBF7                    	jmp	short pmsg_loop	
   134                                  pmsg_ok:
   135 0000010B B410                    	mov	ah, 10h ; Getchar
   136 0000010D CD32                    	int	32h	; TRDOS 386 keyboard interrupt
   137 0000010F C3                      	retn
   138                                  
   139                                  ; /// MESSAGE - DATA ///
   140                                  
   141                                  prg_msg:
   142 00000110 0D0A07                  	db 0Dh, 0Ah, 07h
   143 00000113 5452444F5320333836-     	db 'TRDOS 386 RTC interrupt test program by Erdogan Tan [31/05/2016]'
   143 0000011C 2052544320696E7465-
   143 00000125 727275707420746573-
   143 0000012E 742070726F6772616D-
   143 00000137 206279204572646F67-
   143 00000140 616E2054616E205B33-
   143 00000149 312F30352F32303136-
   143 00000152 5D                 
   144 00000153 0D0A0D0A                	db 0Dh, 0Ah, 0Dh, 0Ah
   145 00000157 28507265737320616E-             db '(Press any key to continue...)'
   145 00000160 79206B657920746F20-
   145 00000169 636F6E74696E75652E-
   145 00000172 2E2E29             
   146 00000175 0D0A00                  	db 0Dh, 0Ah, 0
   147                                  
   148                                  rtc_msg:
   149 00000178 5265616C2054696D65-     	db "Real Time Clock - "
   149 00000181 20436C6F636B202D20 
   150                                  datestr:
   151 0000018A 30302F30302F303030-     	db "00/00/0000"
   151 00000193 30                 
   152 00000194 2020                    	db "  "
   153                                  timestr:	
   154 00000196 30303A30303A3030                db "00:00:00"
   155 0000019E 20                      	db " "
   156 0000019F 00                      	db 0 
   157                                  
   158 000001A0 30                      date_day:     db 30h
   159 000001A1 05                      date_month:   db 05h
   160 000001A2 16                      date_year:    db 16h
   161 000001A3 20                      date_century: db 20h
   162                                  
   163 000001A4 99                      time_second:  db 99h
   164 000001A5 23                      time_minute:  db 23h
   165 000001A6 01                      time_hour:    db 01h
   166                                  
   167 000001A7 00                      db 0
   168 000001A8 495354414E42554C        db 'ISTANBUL'
