.PSECT CLOCK .TITLE VT52 CLOCK DISPLAY ; ; THIS PROGRAM DISPLAYS A DIGITAL CLOCK ON THE FACE OF A VT52 DISPLAY ; ; WRITTEN BY: ; MARK JOHNSON, SEPTEMBER 22, 1977. ; ; RE-WRITTEN JUL 82 IN A WEEK MOMENT TO RUN BACKWARDS F.BORGER ; .MCALL QIO$S,GTIM$S,MRKT$S,WTSE$S,QIOW$,EXIT$S .MCALL QIOW$S,ENTER,LEAVE,GMCR$,ASTX$S ; ESC=33 ;ESCAPE CODE USED TO SIGNAL VT52 COMMAND LF=12 ;LINE FEED CODE BS=10 ;BACKSPACE CODE CURSR=103 ;CURSOR RIGHT COMMAND CURSL=104 ;CURSOR LEFT COMMAND CURSU=101 ;CURSOR UP COMMAND CURSD=102 ;CURSOR DOWN COMMAND ; DIGTOP=41 ;CODE FOR TOP LINE OF DIGITS DIGLIN=20. ;NUMBER OF LINES IN A DIGIT BITS=16. ;NUMBER OF COLUMNS IN A DIGIT ; COHR10=2 COHR1=20. COLCOL=40.+40 COMN10=44. COMN1=62. ; IO.WVB=410 ;NEED TO USE WRITE/PASS ALL FOR CURSOR CONTROL ; .MACRO FILL ADDR,CHAR MOV ADDR,R3 ;GET ADDRESS MOVB CHAR,(R3)+ MOVB CHAR,(R3)+ MOVB CHAR,(R3)+ .ENDM ; ; .MACRO TTYOUT ADDR,COUNT MOV ADDR,OUTDPB+Q.IOPL MOV COUNT,OUTDPB+Q.IOPL+2 DIR$ #OUTDPB .ENDM ; OUTDPB: QIOW$ IO.WVB,5,1,,,,<0,0,0> ATADPB: QIOW$ IO.ATA,5,1,,,, DETDPB: QIOW$ IO.DET,5,1,,,, GETMCR: GMCR$ ASTFLA: .WORD 0 ; CCAST: ;CODE FOR CONTROL C SEEN WHILE RUNNING INC ASTFLA ;SHOW IT HAPPENED ASTX$S ;EXIT THE AST ; ; START: DIR$ #GETMCR DIR$ #ATADPB ; ; INITIALIZE STORAGE ; TTYOUT #SVT52,#SVT52L ;SET VT100 TO VT52 (EASIER THAN CHANGING PROG) MOV #-1,HR10 ;FORCE DISPLAY FIRST TIME MOV #-1,HR1 MOV #-1,MN10 MOV #-1,MN1 ; TTYOUT #ERASE,#ERASEL ;ERASE THE SCREEN ; LOOP: TST ASTFLA ;SEEN A ^C ? BEQ 111$ TTYOUT #ERASE,#ERASEL ;ERASE SCREEN & HOME TTYOUT #SV100,#SV100L ;RESET TO VT100 MODE DIR$ #DETDPB ;DETACH SCOPE EXIT$S ;AND SCRAM 111$: ;DO THE MARK TIME NOW SO IO TIME DOESN'T CAUSE US ;TO SLIP IN TIME MRKT$S #2,#1,#2 ;SET UP ONE SECOND WAIT GTIM$S #TBUF ;GET TIME FROM SYSTEM ; ;MAKE THE TIME AS HRS:MIN:SEC TO END OF DAY, NOT HRS:MIN:SEC FROM START ;OF DAY SO CLOCK RUNS BACKWARDS AND EVERYBODY IS CONFUSED ; MOV TBUF+12,R5 ;GET SECONDS BNE 1111$ SUB #1,TBUF+10 ;FOR EVEN SECONDS, DIDDLE MINUTES BR 1112$ 1111$: NEG R5 ADD #59.,R5 ;AND SUBTRACT FROM 59. MOV R5,TBUF+12 ;REPLACE SECONDS 1112$: MOV TBUF+10,R5 ;DO SAME FOR MINUTES BNE 1113$ SUB #1,TBUF+6 ;FOR EVEN HOURS, DIDDLE MINUTES BR 1114$ 1113$: NEG R5 ADD #59.,R5 MOV R5,TBUF+10 ;REPLACE MINUTES 1114$: MOV TBUF+6,R5 ;AND DO HOURS NEG R5 ADD #23.,R5 MOV R5,TBUF+6 ;AND REPLACE ; NOW REST OF PROGRAM IS THE SAME MOV TBUF+6,R5 ;GET HOURS CLR R4 ;DOUBLE PRECISION DIV #10.,R4 ;TENS DIGIT IN R4, ONES IN R5 ; CMP R4,HR10 ;TENS DIGIT OK? BEQ 1$ ;YES, SKIP THIS STUFF MOV R4,HR10 ;UPDATE MEMORY MOV #COHR10,R2 ;SET UP COLUMN NUMBER JSR PC,CHAR ;DISPLAY IT ; 1$: CMP R5,HR1 ;HOW IS THE UNITS DIGIT? BEQ 2$ ;OK, DON'T CHANGE IT MOV R5,R4 MOV R4,HR1 ;UPDATE MEMORY MOV #COHR1,R2 ;SET UP COLUMN NUMBER JSR PC,CHAR ;SHOW THIS ONE ; 2$: MOV TBUF+10,R5 ;GET MINUTE CLR R4 ;DOUBLE PRECISION DIV #10.,R4 ;TENS DIG IN R4, UNITS IN R5 ; CMP R4,MN10 ;TENS DIGIT OK? BEQ 3$ ;OK, DON'T CHANGE IT MOV R4,MN10 ;UPDATE MEMORY MOV #COMN10,R2 ;SET UP COLUMN NUMBER JSR PC,CHAR ;SHOW THE DIGIT ; 3$: CMP R5,MN1 ;MINUTE DIGIT OK? BEQ 4$ ;OK, DON'T CHANGE IT MOV R5,R4 ;SET UP PARAMETER MOV R4,MN1 ;UPDATE MEMORY MOV #COMN1,R2 ;SET UP COLUMN NUMBER JSR PC,CHAR ;SHOW THIS ONE ; ; UPDATE SECONDS ; ;4$: GTIM$S #TBUF ;FRESH TIME FOR SECONDS ACCURACY 4$: MOV TBUF+12,R5 ;GET SECONDS CLR R4 ;DUBBLE PRECISE DIV #10.,R4 ;TENS IN R4, UNITS IN R5 BIT #1,R5 ;EVEN SECOND BEQ 11$ ;BR IF YES MOV #40,R4 ;FLASH THE COLON MOV R4,R5 BR 12$ 11$: ADD #'0,R4 ;CONVERT TO ASCII ADD #'0,R5 ;CONVERT TO ASCII 12$: FILL #S101,R4 FILL #S102,R4 FILL #S103,R4 ; FILL #S11,R5 FILL #S12,R5 FILL #S13,R5 ; TTYOUT #COLON,#COLEN ;DO THE COLON TTYOUT #HOME,#HOMEL ;PUT CURSOR BACK HOME ; ;WAIT FOR A WHILE ; WTSE$S #2 ;WAIT FOR PREVIOUSLY DECLARED AST ; JMP LOOP ;THEN GO AGAIN .PAGE .SBTTL CHAR - DISPLAY ONE CHARACTER ; ; CHAR - DISPLAY ONE CHARACTER ; ; INPUTS: ; R2 - COLUMN NUMBER OF FIRST COLUMN OF CHARACTER ; R4 - DIGIT TO DISPLAY IN RANGE 0-9. ; ; OUTPUTS: NONE ; CHAR: ENTER R0,R1,R2,R3,R4,R5 MOVB CHTB(R4),R1 ;SET UP CHARACTER TO USE ASL R4 ;CONVERT TO WORDS MOV MPTB(R4),R0 ;GET MAP ADDRESS ; ; MOVE TO UPPER LEFT CORNER OF CHARACTER ; ADD #40,R2 ;SET COLUMN ADDRESS MOVB R2,COLM ;PUT INTO COMMAND MOVB R2,COLM2 ;AND NEW LINE COMMAND 6$: MOVB #DIGTOP,LINE ;SET UP TOP LINE ADDRESS MOVB #DIGTOP,LINE2 ;FOR NEWLIN ALSO TTYOUT #MOVIT,#4 ;SEND THE COMMAND ; ; MAIN CHARACTER LOOP ; MOV #DIGLIN,R3 ;NUMBER OF LINES PER CHARACTER ;4$: MOV (R0),R4 ;ONE ROW OF BITS ; COM (R0)+ ;PREPARE FOR NEXT PASS 4$: MOV (R0)+,R4 ;GET NEXT ROW OF BITS MOV #BITS,R5 ;NUMBER OF BITS PER LINE MOV #LINBUF,R2 ;ADDRESS OF OUTPUT BUFFER ; ; LINE LOOP ; 3$: ROL R4 ;GET THE NEXT BIT BCC 1$ ;CLEAR => DON'T WRITE MOVB R1,(R2)+ ;SET => INSERT CHARACTER BR 2$ ;EXIT ; 1$: MOVB #40,(R2)+ ;USE ERASING SPACE ; 2$: SOB R5,3$ ; ; LINE READY TO SEND ; SUB #LINBUF,R2 ;GET LENGTH OF STUFF TO SEND TTYOUT #LINBUF,R2 ;SEND ONE CHARACTER LINE ; ; MOVE TO NEXT LINE OF CHARACTER ; INCB LINE2 ;SET ONE LINE DOWN TTYOUT #NXTLIN,#NXTLEN ;SEND COMMAND ; SOB R3,4$ ;END OF PASS ; ; CMPB R1,#40 ;END OF SECOND PASS? ; BEQ 5$ ;YES, LEAVE ; ; PASS 2 REPLACES ALL OTHER CHARACTERS WITH BLANKS ;REESE MODIFICATION USED SPACES INSTEAD OF BLANKS SO NO NEED TO DO ; ; MOV #40,R1 ;SET UP BLANK ; SUB #MAPSIZ,R0 ;RESTORE MAP POINTER ; JMP 6$ ;AND DO IT AGAIN ; 5$: LEAVE RTS PC .PAGE .SBTTL BUFFERS, ETC. ; ;ERASE SCREEN BY HOME, ERASE TO END OF SCREEN ; ERASE: .BYTE ESC .ASCII /H/ .BYTE ESC .ASCII /J/ ERASEL=.-ERASE ; ; DIRECT CURSOR ADDRESSING COMMAND BUFFER ; MOVIT: .BYTE ESC .ASCII /Y/ LINE: .BYTE 40 ;40 IS TOP LINE COLM: .BYTE 40 ;40 IS LEFT COLUMN ; HOME: .BYTE ESC .ASCII ?H? HOMEL=.-HOME ; NEW LINE COMMAND STRING ; NXTLIN: .BYTE LF,ESC .ASCII /Y/ LINE2: .BYTE 100 COLM2: .BYTE 0 ;SET UP AT RUN TIME NXTLEN=.-NXTLIN ; ;SET VT100 TO VT52 MODE SVT52: .BYTE ESC,133,77,62,154 SVT52L=.-SVT52 ; ;RESET TO VT100 ON EXIT ADDED TELEVIDEO ESC SEQ 4-MAR-85 HWG ; SV100: .BYTE ESC,74,33,133,66,63,73,61,42,160 SV100L=.-SV100 ; ; INSTRUCTIONS TO DRAW A COLON ; COLON: .BYTE ESC .ASCII /Y/ .BYTE DIGTOP+6 .BYTE COLCOL S101: .ASCII /:::/ .BYTE LF,BS,BS,BS S102: .ASCII /:::/ .BYTE LF,BS,BS,BS S103: .ASCII /:::/ .BYTE LF,LF,LF,BS,BS,BS S11: .ASCII /:::/ .BYTE LF,BS,BS,BS S12: .ASCII /:::/ .BYTE LF,BS,BS,BS S13: .ASCII /:::/ COLEN=.-COLON ; ; OUTPUT LINE BUFFER ; LINBUF: .BYTE 0 ;NULL FOR GOOD MEASURE .BLKB BITS*4 ;COULD BE AS MANY AS FOUR BYTES PER BIT ; .EVEN TBUF: .BLKW 8. ; HR10: .WORD 0 HR1: .WORD 0 MN10: .WORD 0 MN1: .WORD 0 ; ; TABLES ; CHTB: .ASCII /0123456789/ MPTB: .WORD MAP0,MAP1,MAP2,MAP3,MAP4,MAP5,MAP6,MAP7,MAP8,MAP9 ; .PAGE .SBTTL BIT MAPS .NLIST BEX .EVEN ; ; CHARACTER 0 ; MAP0: .WORD 03760,17774,30006,60003,60003 .WORD 60003,60003,60003,60003,60003 .WORD 60003,60003,60003,60003,60003 .WORD 60003,60003,30006,17774,03760 ; MAP1: .WORD 00300,00700,01700,03700,00300 .WORD 00300,00300,00300,00300,00300 .WORD 00300,00300,00300,00300,00300 .WORD 00300,00300,00300,07776,07776 ; MAP2: .WORD 03760,17774,30006,60003,00003 .WORD 00003,00003,00006,00014,00030 .WORD 00060,00140,00300,00600,01400 .WORD 03000,06000,14000,37777,77777 ; MAP3: .WORD 03760,17774,30006,60003,00003 .WORD 00003,00003,00003,00006,00774 .WORD 00774,00006,00003,00003,00003 .WORD 00003,60003,30006,17774,03760 ; MAP4: .WORD 00030,00070,00170,00330,00630 .WORD 01430,03030,06030,14030,30030 .WORD 77777,77777,00030,00030,00030 .WORD 00030,00030,00030,00030,00030 ; MAP5: .WORD 77777,77777,60000,60000,60000 .WORD 60000,60000,77000,37740,00770 .WORD 00014,00006,00003,00003,00003 .WORD 00003,60003,30006,17774,03760 MAP6: .WORD 03760,17774,30006,60003,60000 .WORD 60000,60000,60000,60000,63760 .WORD 77774,70006,60003,60003,60003 .WORD 60003,60003,30006,17774,03760 MAP7: .WORD 77777,77777,00003,00003,00003 .WORD 00006,00014,00030,00060,00140 .WORD 00300,00600,01400,03000,06000 .WORD 14000,30000,60000,60000,60000 MAP8: .WORD 03760,17774,30006,60003,60003 .WORD 60003,60003,60003,30006,17774 .WORD 17774,30006,60003,60003,60003 .WORD 60003,60003,30006,17774,03760 MAP9: .WORD 03760,17774,30006,60003,60003 .WORD 60003,60003,60003,30007,17777 .WORD 03763,00003,00003,00003,00003 .WORD 00003,60003,30006,17774,03760 ; MAPSIZ=MAP1-MAP0 .END START