     1                                  ; ****************************************************************************
     2                                  ; clock2.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'clock2.s')
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; CLOCK2.PRG ! TEST program !
     5                                  ; TRDOS 386 RTC interrupt & timer event test program (by Erdogan Tan)
     6                                  ;
     7                                  ; 02/06/2016
     8                                  ;
     9                                  ; [ Last Modification: 11/06/2016 ]
    10                                  ;
    11                                  ; ****************************************************************************
    12                                  ; clock.s (TRDOS 386, RTC interrupt test program, 31/05/2016)
    13                                  
    14                                  [BITS 32]
    15 00000000 BE[50010000]                    mov     esi, prg_msg
    16 00000005 E832010000              	call	print_msg
    17                                  
    18 0000000A B400                    	mov 	ah, 0   ; set video mode
    19 0000000C B003                    	mov 	al, 3   ; 80x25 text mode, CGA colors
    20 0000000E CD31                    	int	31h     ; TRDOS 386 video interrupt
    21                                  			; (IBM PC/AT ROMBIOS, INT 10h) 
    22                                  
    23                                  	; start (Real Time Clock) timer function
    24 00000010 B3FF                            mov     bl, 0FFh ; signal return (response) byte
    25 00000012 B703                            mov     bh, 3    ; 1 second (rtc interrupt) 
    26 00000014 B901000000              	mov	ecx, 1
    27                                  	;mov	cl, 1
    28 00000019 BA[EB010000]            	mov	edx, timer_event ; signal return (response) address
    29 0000001E B821000000              	mov	eax, 33	; 'systimer'
    30 00000023 CD40                    	int	40h	; TRDOS 386 system call
    31 00000025 0F82F7000000            	jc	terminate
    32                                  
    33 0000002B A2[EC010000]            	mov	[timer_event_number], al 
    34                                  
    35                                  rtc_p1:
    36                                  	; Set cursor position
    37 00000030 6631D2                  	xor	dx, dx  ; row 0, column 0
    38 00000033 30FF                    	xor	bh, bh  ; Video page 0
    39 00000035 B402                    	mov	ah, 2	; set cursor position
    40 00000037 CD31                    	int	31h 	; TRDOS 386 video interrupt
    41                                  
    42                                  	; Print Real Time Clock content
    43                                  	;
    44 00000039 B402                    	mov	ah, 2	; read the time
    45 0000003B CD35                    	int	35h	; TRDOS 386 date&time interrupt
    46 0000003D 0F82DF000000            	jc	terminate
    47                                  
    48 00000043 8835[E8010000]                  mov     [time_second], dh
    49                                          ;mov    [time_minute], cl
    50                                          ;mov    [time_hour], ch
    51 00000049 66890D[E9010000]                mov     [time_minute], cx
    52                                  	;
    53 00000050 B404                    	mov	ah, 4	; read the date
    54 00000052 CD35                    	int	35h	; TRDOS 386 date&time interrupt
    55                                  			; (IBM PC/AT ROMBIOS, INT 1Ah)
    56 00000054 0F82C8000000                    jc      terminate
    57                                  
    58                                  	;mov	[date_day], dl
    59                                  	;mov	[date_month], dh
    60 0000005A 668915[E4010000]        	mov	[date_day], dx
    61                                  	;mov	[date_year], cl
    62                                  	;mov	[date_century], ch
    63 00000061 66890D[E6010000]        	mov	[date_year], cx
    64                                  	;
    65 00000068 A0[E7010000]            	mov	al, [date_century]
    66 0000006D E8BC000000              	call	bcd_to_ascii
    67 00000072 66A3[D4010000]          	mov	[datestr+6], ax
    68 00000078 A0[E6010000]            	mov	al, byte [date_year]
    69 0000007D E8AC000000              	call	bcd_to_ascii
    70 00000082 66A3[D6010000]          	mov	[datestr+8], ax
    71 00000088 A0[E5010000]            	mov	al, byte [date_month]
    72 0000008D E89C000000              	call	bcd_to_ascii
    73 00000092 66A3[D1010000]          	mov	[datestr+3], ax
    74 00000098 A0[E4010000]            	mov	al, byte [date_day]
    75 0000009D E88C000000              	call	bcd_to_ascii
    76 000000A2 66A3[CE010000]          	mov	[datestr], ax
    77                                  	;
    78 000000A8 A0[EA010000]                    mov     al, byte [time_hour]
    79 000000AD E87C000000              	call	bcd_to_ascii
    80 000000B2 66A3[DA010000]          	mov	[timestr], ax
    81 000000B8 A0[E9010000]                    mov     al, byte [time_minute]
    82 000000BD E86C000000              	call	bcd_to_ascii
    83 000000C2 66A3[DD010000]          	mov	[timestr+3], ax
    84 000000C8 A0[E8010000]                    mov     al, byte [time_second]
    85 000000CD E85C000000              	call	bcd_to_ascii
    86 000000D2 66A3[E0010000]          	mov	[timestr+6], ax
    87                                  	;		
    88 000000D8 BB[BC010000]            	mov	ebx, rtc_msg ; message offset
    89 000000DD B9FF000000              	mov	ecx, 255 ; message length 
    90 000000E2 BA0F000000              	mov	edx, 0Fh ; white color
    91 000000E7 B823000000              	mov	eax, 35  ; 'sysmsg'
    92 000000EC CD40                    	int	40h	 ; TRDOS 386 system call
    93                                  
    94                                  rtc_p2:
    95 000000EE 803D[EB010000]FF        	cmp	byte [timer_event], 0FFh
    96 000000F5 750C                    	jne	short rtc_p3
    97                                  
    98 000000F7 C605[EB010000]00        	mov	byte [timer_event], 0
    99 000000FE E92DFFFFFF              	jmp	rtc_p1
   100                                  
   101                                  rtc_p3:
   102                                  	; Check keyboard buffer
   103 00000103 B411                    	mov	ah, 11h
   104 00000105 CD32                    	int 	32h ; TRDOS 386 keyboard interrupt
   105                                  		    ; (IBM PC/AT ROMBIOS, INT 16h)			
   106 00000107 74E5                    	jz	short rtc_p2 ; keyboard buffer empty
   107                                  
   108 00000109 E829000000              	call	getch
   109 0000010E 3C1B                    	cmp	al, 1Bh
   110 00000110 77DC                    	ja	short rtc_p2
   111 00000112 740E                    	je	short terminate
   112                                  
   113                                  	; Stop timer event
   114 00000114 0FB61D[EC010000]        	movzx	ebx, byte [timer_event_number]
   115                                  		; bh = 0 -> stop timer event
   116 0000011B B821000000              	mov	eax, 33	; 'systimer'
   117 00000120 CD40                    	int	40h	; TRDOS 386 system call
   118                                  
   119                                  terminate:
   120 00000122 B801000000              	mov	eax, 1	; 'sysexit'
   121 00000127 CD40                    	int	40h	; TRDOS 386 system call
   122                                  hang:
   123 00000129 90                      	nop
   124 0000012A 90                      	nop
   125 0000012B 90                      	nop
   126 0000012C EBFB                    	jmp	short hang
   127                                  
   128                                  bcd_to_ascii:
   129                                  	; INPUT ->
   130                                  	;	AL = Packed BCD number
   131                                  	; OUTPUT ->
   132                                  	;	AX = ASCII word/number
   133                                  	;
   134 0000012E D410                    	db	0D4h, 10h	; Undocumented inst. AAM
   135                                  				; AH = AL / 10h
   136                                  				; AL = AL MOD 10h
   137 00000130 660D3030                	or	ax, '00'	; Make it ASCII based
   138 00000134 86E0                            xchg	ah, al 
   139 00000136 C3                      	retn	 
   140                                  
   141                                  getch:
   142                                  	; Getchar by using keyboard interrupt
   143 00000137 B410                    	mov	ah, 10h
   144 00000139 CD32                    	int 	32h ; TRDOS 386 keyboard interrupt
   145                                  		    ; (IBM PC/AT ROMBIOS, INT 16h)			
   146 0000013B C3                      	retn
   147                                  
   148                                  print_msg:
   149 0000013C 66BB0700                	mov	bx, 7
   150 00000140 B40E                            mov     ah, 0Eh
   151                                  pmsg_loop:
   152 00000142 AC                      	lodsb
   153 00000143 20C0                    	and	al, al
   154 00000145 7404                    	jz	short pmsg_ok
   155 00000147 CD31                    	int	31h	; TRDOS 386 video interrupt
   156 00000149 EBF7                    	jmp	short pmsg_loop	
   157                                  pmsg_ok:
   158 0000014B B410                    	mov	ah, 10h ; Getchar
   159 0000014D CD32                    	int	32h	; TRDOS 386 keyboard interrupt
   160 0000014F C3                      	retn
   161                                  
   162                                  ; /// MESSAGE - DATA ///
   163                                  
   164                                  prg_msg:
   165 00000150 0D0A07                  	db 0Dh, 0Ah, 07h
   166 00000153 5452444F5320333836-     	db 'TRDOS 386 RTC & timer event test program by Erdogan Tan [11/06/2016]'
   166 0000015C 205254432026207469-
   166 00000165 6D6572206576656E74-
   166 0000016E 20746573742070726F-
   166 00000177 6772616D2062792045-
   166 00000180 72646F67616E205461-
   166 00000189 6E205B31312F30362F-
   166 00000192 323031365D         
   167 00000197 0D0A0D0A                	db 0Dh, 0Ah, 0Dh, 0Ah
   168 0000019B 28507265737320616E-             db '(Press any key to continue...)'
   168 000001A4 79206B657920746F20-
   168 000001AD 636F6E74696E75652E-
   168 000001B6 2E2E29             
   169 000001B9 0D0A00                  	db 0Dh, 0Ah, 0
   170                                  
   171                                  rtc_msg:
   172 000001BC 5265616C2054696D65-     	db "Real Time Clock - "
   172 000001C5 20436C6F636B202D20 
   173                                  datestr:
   174 000001CE 30302F30302F303030-     	db "00/00/0000"
   174 000001D7 30                 
   175 000001D8 2020                    	db "  "
   176                                  timestr:	
   177 000001DA 30303A30303A3030                db "00:00:00"
   178 000001E2 20                      	db " "
   179 000001E3 00                      	db 0 
   180                                  
   181 000001E4 11                      date_day:     db 11h
   182 000001E5 06                      date_month:   db 06h
   183 000001E6 16                      date_year:    db 16h
   184 000001E7 20                      date_century: db 20h
   185                                  
   186 000001E8 99                      time_second:  db 99h
   187 000001E9 30                      time_minute:  db 30h
   188 000001EA 02                      time_hour:    db 02h
   189                                  
   190 000001EB 00                      timer_event: db 0
   191 000001EC 00                      timer_event_number: db 0
   192                                  
   193 000001ED 495354414E42554C00      db 'ISTANBUL', 0
