; -*-MIDAS-*- TITLE DIGITAL CROCK ; Original program hacked up by GLS. ; 10X/20X version hacked by EAK. ; Modified by KLH for DM2500's. if1 { its==1 ; can run on either ITS or tnx==1 ; 10X or 20X .insrt system } ; If not ITS, can't use ^P codes. Must define terminal type explicitly. ifndef t%its, t%its==its ; ITS ^P codes ifndef t%hz15, t%hz15==0 ; Hazeltine 1500 ifndef t%dm25, t%dm25==0 ; Datamedia 2500 ifndef t%vt52, t%vt52==0 ; VT52 ifndef t%c100, t%c100==0 ; Concept 100 ifn t%its+t%hz15+t%dm25+t%vt52+t%c100-1, .fatal You must specify exactly one terminal type. ; ACs A=1 B=2 C=3 D=4 E=5 F=6 G=7 H=10 S=14 X=15 Y=16 P=17 call=pushj p, return=popj p, ifn its,{ toch=17 .insrt syseng;$call macro } ifn 20x,{ TM%DPY=1_35. VTSOP=JSYS 635 RTMOD=JSYS 636 STMOD=JSYS 637 RTCHR=JSYS 640 } equals var,.scalar ifn tnx, var oldmod lpdl==40 var pdl(lpdl) dcrock: move p,[-lpdl,,pdl-1] ifn its,{ $call open,[#toch,[sixbit/tty/]][][#%tjdis+.uao] .lose %lsfil } ifn tnx,{ movei a,.priin rfmod movem b,oldmod ; save old status trz b,tt%dam ; set to 8-bit i/o ifn t%its,{ ; VTS tro b,1_7 ; turn on output translation } sfmod ; zap ifn t%its,{ rtmod tlo b,(tm%dpy) stmod } } ifn its,{ move a,[440700,,frame] movei b,lframe .call [ setz ? sixbit /siot/ 1000,,toch ? a ? b ((setz))] .lose %lsfil } ifn tnx,{ movei a,.priou hrroi b,frame movni c,lframe sout } move a,[440700,,ob] movem a,obp movei a,lob movem a,obc repeat 6, setzm screen+.rpcnt seto h, hackit: ifn its,{ .rdtime s, .rtime c, camn c,h .value [asciz /:Clock not set./] move h,c } ifn tnx,{ time move s,a seto 2, ; get current time setz 4, ; with no funny daylight savings or timezone stuff odcnv ; get time movei a,(d) camn a,h jrst hackit move h,a movei c,0 idivi a,60.*60. call sixn move a,b idivi a,60. call sixn move a,b call sixn } MOVNI D,6 LOOP: LSHC B,6 ANDI B,17 MOVE E,DIGITS(B) MOVE F,E EXCH F,SCREEN+6(D) XOR F,E JUMPE F,NEXT MOVNI G,43 CYCLE: JUMPGE F,NXTBIT hlrz x,chpos+43(g) add x,horiz+6(d) hrrz y,chpos+43(g) addi y,4+2 call movcur jumpge e,blank movei a,"# call outb jrst nxtbit blank: call clchar nxtbit: lshc e,1 aojl g,cycle next: aojl d,loop movei y,22. movei x,69. call movcur call force ifn its,{ .listen a, jumpn a,quit addi s,28. movn s,s .sleep s, jrst hackit } ifn tnx,{ movei a,.priin ife t%vt52,{ sibe jrst quit } ifn t%vt52,{ sibe jrst [ bin caie b,^S jrst quit ;X; sibe ;X; caia ;X; jrst quit bin caie b,^Q jrst quit jrst .+1 ] } time add a,b sub a,s jumpl a,hackit imuli a,1000. idiv a,b subi a,7 disms jrst hackit } subttl Output lob==200. var ob(/5) var obp var obc outb: idpb a,obp sosg obc call force return subttl Operating system subroutines ifn its,{ force: push p,b movei b,lob sub b,obc jumpe b,for1 push p,a move a,[440700,,ob] movem a,obp addm b,obc $call siot,[#toch,a,b] .lose %lsfil pop p,a for1: pop p,b return quit: .logout 1, } ifn tnx,{ force: push p,c movei c,lob exch c,obc subi c,lob jumpe c,for1 push p,a push p,b movei a,.priou move b,[440700,,ob] movem b,obp sout pop p,b pop p,a for1: pop p,c return quit: movei x,0 movei y,23. call movcur call force movei 1,.priin move 2,oldmod sfmod ; Restore old modes haltf jrst dcrock sixn: push p,a push p,b idivi a,10. lsh c,6 addi c,'0(a) lsh c,6 addi c,'0(b) pop p,b pop p,a return } subttl Terminal subroutines movcur: push p,a ifn t%its,{ movei a,^P call outb movei a,"V call outb movei a,10(y) call outb movei a,^P call outb movei a,"H call outb movei a,10(x) call outb } ifn t%dm25,{ movei a,^L ; DM2500 abs move call outb movei a,(x) trc a,140 call outb movei a,(y) trc a,140 call outb } ifn t%hz15,{ movei a,"~ call outb movei a,^Q call outb movei a,(x) caig a,30. addi a,140 call outb movei a,140(y) call outb } ifn t%vt52,{ movei a,33 call outb movei a,"Y call outb movei a,40(y) call outb movei a,40(x) call outb } ifn t%c100,{ movei a,33 call outb movei a,"a call outb movei a,40(y) call outb movei a,40(x) call outb } pop p,a return clchar: push p,a ifn its&t%its,{ movei a,^P call outb movei a,"K call outb } ife its&t%its,{ movei a,40 call outb ;X; movei a,^H ;X; call outb } pop p,a return SCREEN: BLOCK 6 RADIX 2. DIGITS: 011101000110011101011100110001011100 001000110000100001000010000100011100 011101000100001000100010001000111110 011101000100001011100000110001011100 000100011001010100101111100010000100 111111000010000111100000110001011100 011101000110000111101000110001011100 111110000100001000100010001000100000 011101000110001011101000110001011100 011101000110001011110000110001011100 RADIX 8. ; For each terminal definition, HAKCLR specifies bytes to clear screen, ; HAKMOV to move cursor to given X, Y, and HACK takes a string ; generating the appropriate bytes for commands Up, Down, Back, and Forward. ; Unrecognized chars are simply output (eg "$"). ifn t%its,{ DEFINE HAKCLR ^P ? "C TERMIN DEFINE HAKMOV X,Y ^P ? "H ? 10+ ^P ? "V ? 10+ TERMIN DEFINE HACK CHARS IRPC X,,[CHARS] IFSE X,$, "$ IFSE X,U, ^P ? "U IFSE X,D, ^P ? "D IFSE X,B, ^P ? "B IFSE X,F, 40 TERMIN TERMIN } ifn t%vt52,{ DEFINE HAKCLR 33 ? "H ? 33 ? "J TERMIN DEFINE HAKMOV H,V 33 ? "Y ? 40+ ? 40+ TERMIN DEFINE HACK CHARS IRPC X,,[CHARS] IFSE X,$, "$ IFSE X,U, 33 ? "A IFSE X,D, ^J IFSE X,B, ^H IFSE X,F, 40 TERMIN TERMIN } ifn t%c100,{ DEFINE HAKCLR ^L TERMIN DEFINE HAKMOV H,V 33 ? "a ? 40+ ? 40+ TERMIN DEFINE HACK CHARS IRPC X,,[CHARS] IFSE X,$, "$ IFSE X,U, 33 ? "; IFSE X,D, ^J IFSE X,B, ^H IFSE X,F, 40 TERMIN TERMIN } ifn t%dm25,{ DEFINE HAKCLR 37 ? 37 TERMIN DEFINE HAKMOV X,Y ^L ? 140# ? 140# TERMIN DEFINE HACK CHARS IRPC X,,[CHARS] IFSE X,U, ^Z .STOP IFSE X,D, ^J .STOP IFSE X,B, ^H .STOP IFSE X,F, ^\ .STOP "X TERMIN TERMIN } ifn t%hz15,{ DEFINE HAKCLR "~ ? 34 TERMIN DEFINE HAKMOV X,Y "~ ? ^Q IFG -30.,{} .ELSE {140+} 140+ TERMIN DEFINE HACK CHARS IRPC X,,[CHARS] IFSE X,U, "~ ? ^L .STOP IFSE X,D, "~ ? ^K .STOP IFSE X,B, ^H .STOP IFSE X,F, ^P .STOP "X TERMIN TERMIN } FRAME: .BYTE 7 HAKCLR HAKMOV 8.,4. HACK $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ HACK DB$DB$DB$DB$DB$DB$DB$DB$DB$DB$ HACK BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$ HACK BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$ HACK BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$BB$ HACK BB$BB$ HACK UB$UB$UB$UB$UB$UB$UB$UB$UB$ HAKMOV 8.+1+2+5+3+5+2, 4+3 HACK $$BBD$$BBDD$$BBD$$ HAKMOV 8.+1+2+5+3+5+6+5+3+5+2, 4+3 HACK $$BBD$$BBDD$$BBD$$ LFRAME==.BYTC .BYTE CHPOS: IRPC Y,,[0123456] IRPC X,,[01234] X,,Y TERMIN TERMIN HORIZ: 8+1+2 8+1+2+5+3 8+1+2+5+3+5+6 8+1+2+5+3+5+6+5+3 8+1+2+5+3+5+6+5+3+5+6 8+1+2+5+3+5+6+5+3+5+6+5+3 PATCH: BLOCK 40 END DCROCK