title 'MACTIME as of April 6, 1982' ; ; ; Here is an interesting "patch" to Digital Research's ; MAC.COM, that incorporates a "real time clock display. This ; patch works with MAC.COM version 2.0 ONLY. Merge it into ; MAC.COM as follows: ; ; A>DDT MAC.COM ; NEXT PC ; 2F00 0100 ; -IMACTIME.HEX ; -R ; NEXT PC ; 308E 0000 ; -^C ; A>SAVE 48 MACTIME.COM ; ; Now you have a new "MAC" command file called MACTIME.COM; ; now re-assemble MACTIME.ASM (assuming your clock/calendar ; board, and the time is properly set) with MACTIME.COM. ; ; Notice, that the date and time will be displayed at the ; start of execution. Also because the "title" pseudo-op was ; used, the time is listed in the ".PRN" file that is ; generated, on each page heading. ; ; Best regards, ; ; Kelly Smith, MP/M-Net (tm) Sysop ; (805) 527-9321 (Modem, 300 Baud) ; ; 06/Apr/82 Revised for Godbout System Support 1 clock ; by Bill Bolton, Software Tools, Australia ; ; 20/Oct/80 Original version by Kelly Smith ; ; ; bdos equ 5 pbuf equ 9 mac equ 128h ; MAC.COM entry address overlay equ 2cd3H cr equ 0dh ; ASCII carriage return lf equ 0ah ; ASCII line feed true equ 0ffh false equ not true; define false clkread equ 10H timlen equ 12 gbclkc equ 06Ah ; real time clock base port address gbclkd equ gbclkc+1 org 0100h jmp start org 2f00h ; version 2.0 mac.com entry address start: mvi a,0+clkread out gbclkc in gbclkd cpi 0ffh ;clock board present? jz done ;no, just run normally call rtime lxi h,time mov a,m cpi '0' jnz go$on mvi a,' ' go$on: sta day inx h mov a,m sta day+1 inx h mov a,m sta month inx h mov a,m sta month+1 inx h mov a,m sta year inx h mov a,m sta year+1 inx h mov a,m sta hour inx h mov a,m sta hour+1 inx h mov a,m sta minutes inx h mov a,m sta minutes+1 inx h mov a,m sta seconds inx h mov a,m sta seconds+1 ; ; test the date, and convert it to four year calendar format ; lda month ; get high byte of the month cpi '1' ; in the range of january to september? jnz jansept ; yes lda month+1 cpi '0' lxi d,oct ; October? jz mmonth ; print, if so cpi '1' ; november? lxi d,nov jz mmonth ; print, if so lxi d,dec ; december. jmp mmonth ; print it... ; jansept: lda month+1 ; it's january to september cpi '1' ; january? lxi d,jan jz mmonth ; print, if so cpi '2' ; february? lxi d,feb jz mmonth ; print, if so cpi '3' ; march? lxi d,mar jz mmonth ; print, if so cpi '4' ; april? lxi d,apr jz mmonth ; print, if so cpi '5' ; may? lxi d,may jz mmonth ; print, if so cpi '6' ; june? lxi d,jun jz mmonth ; print month cpi '7' ; july? lxi d,jul jz mmonth ; print, if so cpi '8' ; august? lxi d,aug jz mmonth ; print, if so lxi d,sep ; it's september mmonth: mvi b,4 ; four characters to move lxi h,fakem ; place to move real month movem: ldax d ; get the character to move mov m,a ; move it inx h ; bump both pointers inx d dcr b ; de-bump the count left to move.. jnz movem ; loop 'till all characters moved lxi h,overlay ; point to overlay area lxi d,fakem ; point to stuff to be moved mvi b,end$move-start$move ; how much to move... move1: ldax d ; get stuff to move mov m,a ; move it... inx h ; bump both pointers inx d dcr b ; de-bump the move counter jnz move1 ; loop 'till it's all moved done: jmp mac ; now jump into MAC... rtime: lxi h,time ;Address of time save area lxi d,atable ;Address of digit table mvi b,timlen/2 ;Number of loops to do tloop: call rone ;get digit value ani 0fh ;mask of high nibble adi '0' mov m,a inx h call rone ani 0fh adi '0' mov m,a ;save into table inx h ;point to next digit dcr b ;adjust loop count jnz tloop ret rone: ldax d ;Get the digit address inx d ;Point to next address out gbclkc ;Output the digit address cpi 5+clkread ;Check for hours 10 digit in gbclkd ;Get the digit rnz ;If not the hours ten digit sui 8 ;Kill the 24 hour bit ret ; ATABLE: DB 8+clkread ;digit address table DB 7+clkread DB 10+clkread DB 9+clkread DB 12+clkread DB 11+clkread DB 5+clkread DB 4+clkread DB 3+clkread DB 2+clkread DB 1+clkread DB 0+clkread ; ; message buffers ; time db 0,0,0,0,0,0,0,0,0,0,0,0 start$move equ $ ; start moving from here fakem: ds 2 ; storage for faked-out month, ; which will overlay the next four bytes month: ds 2 ; storage for the real month and date day: ds 2 db ', 19' year: db '82 ' ; the year... hour: db 'xx:' ; the hour... minutes:db 'xx:' ; the minute... seconds:db 'xx' ; the second... db 0dh ; string delimeter end$move equ $ ; end of move errmsg: db cr,lf,'The Clock Board is NOT INSTALLED!',cr,lf,'$' jan: db 'Jan ' feb: db 'Feb ' mar: db 'Mar ' apr: db 'Apr ' may: db 'May ' jun: db 'Jun ' jul: db 'Jul ' Aug: db 'Aug ' sep: db 'Sep ' oct: db 'Oct ' nov: db 'Nov ' dec: db 'Dec ' end