; -*-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 ifn t%its+t%hz15+t%dm25+t%vt52-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 ifn its,{ toch=17 .insrt syseng;$call macro } 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 1,.priin rfmod movem 2,oldmod ; save old status trz 2,tt%dam ; set to 8-bit i/o sfmod ; zap } 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 jrst hackit 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. pushj p,sixn move a,b idivi a,60. pushj p,sixn move a,b pushj p,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 pushj p,movcur jumpge e,blank movei a,"# pushj p,outb jrst nxtbit blank: pushj p,clchar nxtbit: lshc e,1 aojl g,cycle next: aojl d,loop movei y,22. movei x,69. pushj p,movcur pushj p,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 pushj p,force popj p, 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 popj p, 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 popj p, quit: movei x,0 movei y,23. pushj p,movcur pushj p,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 popj p, } subttl Terminal subroutines movcur: push p,a ifn t%its,{ movei a,^P pushj p,outb movei a,"V pushj p,outb movei a,10(y) pushj p,outb movei a,^P pushj p,outb movei a,"H pushj p,outb movei a,10(x) pushj p,outb } ifn t%dm25,{ movei a,^L ; DM2500 abs move pushj p,outb movei a,(x) trc a,140 pushj p,outb movei a,(y) trc a,140 pushj p,outb } ifn t%hz15,{ movei a,"~ pushj p,outb movei a,^Q pushj p,outb movei a,(x) caig a,30. addi a,140 pushj p,outb movei a,140(y) pushj p,outb } ifn t%vt52,{ movei a,33 pushj p,outb movei a,"Y pushj p,outb movei a,40(y) pushj p,outb movei a,40(x) pushj p,outb } pop p,a popj p, clchar: push p,a ifn t%its,{ movei a,^P pushj p,outb movei a,"K pushj p,outb } ife t%its,{ movei a,40 pushj p,outb ;X; movei a,^H ;X; pushj p,outb } pop p,a popj p, 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%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