From c8f1e78e1b95fe85d7e98cdf04fa1800ef170416 Mon Sep 17 00:00:00 2001 From: aap Date: Fri, 30 Oct 2015 19:41:54 +0100 Subject: [PATCH] key cycle and memory control basically working --- Makefile | 5 + apr.c | 506 ++++++++++++++++++++++++++++ extra_panel.png | Bin 0 -> 5686 bytes ind_panel.png | Bin 0 -> 29121 bytes key_d.png | Bin 0 -> 614 bytes key_n.png | Bin 0 -> 547 bytes key_u.png | Bin 0 -> 598 bytes lamp_off.png | Bin 0 -> 280 bytes lamp_on.png | Bin 0 -> 282 bytes main.c | 863 ++++++++++++++++++++++++++++++++++++++++++++++++ mem | 23 ++ mem.c | 50 +++ op_panel.png | Bin 0 -> 20946 bytes pdp6.h | 95 ++++++ switch_d.png | Bin 0 -> 355 bytes switch_u.png | Bin 0 -> 356 bytes 16 files changed, 1542 insertions(+) create mode 100644 Makefile create mode 100644 apr.c create mode 100644 extra_panel.png create mode 100644 ind_panel.png create mode 100644 key_d.png create mode 100644 key_n.png create mode 100644 key_u.png create mode 100644 lamp_off.png create mode 100644 lamp_on.png create mode 100644 main.c create mode 100644 mem create mode 100644 mem.c create mode 100644 op_panel.png create mode 100644 pdp6.h create mode 100644 switch_d.png create mode 100644 switch_u.png diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b00b596 --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +SRC=main.c apr.c mem.c +CFLAGS=-Wno-shift-op-parentheses -Wno-logical-op-parentheses\ + -L/usr/local/lib -I/usr/local/include -lSDL -lSDL_image -lpthread +pdp6: $(SRC) pdp6.h + $(CC) $(CFLAGS) $(SRC) -o pdp6 diff --git a/apr.c b/apr.c new file mode 100644 index 0000000..7656711 --- /dev/null +++ b/apr.c @@ -0,0 +1,506 @@ +#include "pdp6.h" + +typedef void *Pulse(void); +#define pulse(p) void *p(void) + +/* external pulses: + * KEY MANUAL + * MAI-CMC ADDR ACK + * MAI RD RS + */ + +Apr apr; +int extpulse; +Pulse *nextpulse; +Pulse *mc_rst1_ret; + +void +set_ex_mode_sync(bool value) +{ + apr.ex_mode_sync = value; + if(apr.ex_mode_sync) + apr.ex_user = 1; // 5-13 +} + +void +set_pi_cyc(bool value) +{ + apr.pi_cyc = value; + if(!apr.pi_cyc) + apr.ex_pi_sync = 1; // 5-13 +} + +void +set_mc_rq(bool value) +{ + apr.mc_rq = value; // 7-9 + if(value && (apr.mc_rd || apr.mc_wr)){ + membus0 |= MEMBUS_RQ_CYC; + wakemem(); + }else + membus0 &= ~MEMBUS_RQ_CYC; +} + +void +set_mc_wr(bool value) +{ + apr.mc_wr = value; // 7-9 + if(value) + membus0 |= MEMBUS_WR_RQ; + else + membus0 &= ~MEMBUS_WR_RQ; + set_mc_rq(apr.mc_rq); +} + +void +set_mc_rd(bool value) +{ + apr.mc_rd = value; // 7-9 + if(value) + membus0 |= MEMBUS_RD_RQ; + else + membus0 &= ~MEMBUS_RD_RQ; + set_mc_rq(apr.mc_rq); +} + +void +set_key_rim_sbr(bool value) +{ + apr.key_rim_sbr = value | apr.sw_rim_maint; // 5-2 +} + +bool +calcaddr(void) +{ + u8 ma18_25; + bool ma_ok, ma_fmc_select; + + // 5-13 + apr.ex_inh_rel = !apr.ex_user || apr.ex_pi_sync || + (apr.ma&0777760) == 0 || apr.ex_ill_op; + // 7-4 + ma18_25 = apr.ma>>10 & 0377; + ma_ok = ma18_25 <= apr.pr; + // 7-2 + ma_fmc_select = !apr.key_rim_sbr && (apr.ma&0777760) == 0; + // 7-5 + apr.rla = ma18_25; + if(!apr.ex_inh_rel) + apr.rla += apr.rlr; + + membus0 &= ~0007777777761; + membus0 |= ma_fmc_select ? MEMBUS_MA_FMC_SEL1 : MEMBUS_MA_FMC_SEL0; + membus0 |= (apr.ma&01777) << 4; + membus0 |= (apr.rla&017) << 14; + membus0 |= apr.rla & 0020 ? MEMBUS_MA21_1|MEMBUS_MA21 : MEMBUS_MA21_0; + membus0 |= apr.rla & 0040 ? MEMBUS_MA20_1 : MEMBUS_MA20_0; + membus0 |= apr.rla & 0100 ? MEMBUS_MA19_1 : MEMBUS_MA19_0; + membus0 |= apr.rla & 0200 ? MEMBUS_MA18_1 : MEMBUS_MA18_0; + membus0 |= apr.ma & 01 ? MEMBUS_MA35_1 : MEMBUS_MA35_0; + return ma_ok; +} + +pulse(kt4); +pulse(mc_wr_rs); + +// TODO: find PI REQ, A LONG + +pulse(pi_reset){ + printf("PI RESET\n"); + apr.pi_active = 0; // 8-4 + apr.pih = 0; // 8-4 + apr.pir = 0; // 8-4 + apr.pio = 0; // 8-3 + return NULL; +} + +pulse(ar_flag_clr){ + printf("AR FLAG CLR\n"); + apr.pc_chg_flag = 0; // 6-10 + apr.ar_ov_flag = 0; // 6-10 + apr.ar_cry0_flag = 0; // 6-10 + apr.ar_cry1_flag = 0; // 6-10 + apr.chf7 = 0; // 6-19 + return NULL; +} + +pulse(mr_clr){ + printf("MR CLR\n"); + apr.ir = 0; // 5-7 + apr.mq = 0; // 6-13 + apr.sc = 0; // 6-15 + apr.fe = 0; // 6-15 + + apr.mc_rd = 0; // 7-9 + apr.mc_wr = 0; // 7-9 + apr.mc_rq = 0; // 7-9 + apr.mc_stop = 0; // 7-9 + apr.mc_stop_sync = 0; // 7-9 + apr.mc_split_cyc_sync = 0; // 7-9 + + set_ex_mode_sync(0); // 5-13 + apr.ex_uuo_sync = 0; // 5-13 + apr.ex_pi_sync = 0; // 5-13 + // TODO: MP CLR, DS CLR + + /* sbr flip-flops */ + apr.key_rd_wr = 0; // 5-2 + mc_rst1_ret = NULL; + return NULL; +} + +pulse(mr_start){ + printf("MR START\n"); + // IOB RESET + apr.cpa_iot_user = 0; // 8-5 + apr.cpa_illeg_op = 0; // 8-5 + apr.cpa_non_exist_mem = 0; // 8-5 + apr.cpa_clock_en = 0; // 8-5 + apr.cpa_clock_flag = 0; // 8-5 + apr.cpa_pc_chg_en = 0; // 8-5 + apr.cpa_pdl_ov = 0; // 8-5 + apr.cpa_arov_en = 0; // 8-5 + apr.cpa_pia33 = 0; // 8-5 + apr.cpa_pia34 = 0; // 8-5 + apr.cpa_pia35 = 0; // 8-5 + apr.pi_ov = 0; // 8-4 + set_pi_cyc(0); // 8-4 + pi_reset(); // 8-4 + ar_flag_clr(); // 6-10 + apr.ex_user = 0; // 5-13 + apr.ex_ill_op = 0; // 5-13 + apr.pr = 0; // 5-13, 7-4 + apr.rlr = 0; // 5-13, 7-5 + apr.rla = 0; + +// apr.ex_user = 1; +// apr.rlr = 2; +// apr.pr = 1; + return NULL; +} + +pulse(mr_pwr_clr){ + printf("MR PWR CLR\n"); + apr.run = 0; // 5-1 + /* order matters because of EX PI SYNC */ + mr_start(); // 5-2 + mr_clr(); // 5-2 + return NULL; +} + +pulse(st7){ + printf("ST7\n"); + return NULL; +} + +pulse(it1a){ + printf("IT1A\n"); + return NULL; +} + +/* + * Memory Control + */ + +pulse(mc_rs_t1){ + printf("MC RS T1\n"); + set_mc_rd(0); + if(apr.key_ex_next || apr.key_dep_next) + apr.mi = apr.mb; // 7-7 + return mc_rst1_ret; +} + +pulse(mc_rs_t0){ + printf("MC RS T0\n"); + apr.mc_stop = 0; + return mc_rs_t1; +} + +pulse(mc_wr_rs){ + printf("MC WR RS\n"); + if(apr.ma == apr.mas) + apr.mi = apr.mb; // 7-7 + membus1 = apr.mb; + membus0 |= MEMBUS_MAI_WR_RS; + wakemem(); + if(!apr.mc_stop) + return mc_rs_t0; + return NULL; +} + +pulse(mc_addr_ack){ + printf("MC ADDR ACK\n"); + set_mc_rq(0); + if(!apr.mc_rd && apr.mc_wr) + return mc_wr_rs; + return NULL; +} + +pulse(mc_non_exist_rd){ + printf("MC NON EXIST RD\n"); + if(!apr.mc_stop) + return mc_rs_t0; + return NULL; +} + +pulse(mc_non_exist_mem_rst){ + printf("MC NON EXIST MEM RST\n"); + if(apr.mc_rd){ + /* call directly - no other pulses after it in this case */ + mc_addr_ack(); + return mc_non_exist_rd; + }else + return mc_addr_ack(); + return NULL; +} + +pulse(mc_non_exist_mem){ + printf("MC NON EXIST MEM\n"); + apr.cpa_non_exist_mem = 1; + // TODO: IOB PI REQ CPA PIA + if(!apr.sw_mem_disable) + return mc_non_exist_mem_rst; + return NULL; +} + +pulse(mc_illeg_address){ + printf("MC ILLEG ADDRESS\n"); + apr.cpa_illeg_op = 1; + // TODO: IOB PI REQ CPA PIA + return st7; +} + +pulse(mc_rq_pulse){ + printf("MC RQ PULSE\n"); + apr.mc_stop = 0; // 7-9 + /* catch non-existent memory */ + extpulse |= 4; + if(calcaddr() == 0 && !apr.ex_inh_rel) + return mc_illeg_address; + set_mc_rq(1); + if(apr.key_mem_stop || apr.ma == apr.mas && apr.sw_addr_stop){ + apr.mc_stop = 1; // 7-9 + // TODO: what is this? does it make any sense? + if(apr.key_mem_cont) + return kt4; + } + return NULL; +} + +pulse(mc_rdwr_rq_pulse){ + printf("MC RD/RW RQ PULSE\n"); + set_mc_rd(1); // 7-9 + set_mc_wr(1); // 7-9 + apr.mb = 0; + apr.mc_stop_sync = 1; // 7-9 + return mc_rq_pulse; +} + +pulse(mc_rd_rq_pulse){ + printf("MC RD RQ PULSE\n"); + set_mc_rd(1); // 7-9 + set_mc_wr(0); // 7-9 + apr.mb = 0; + return mc_rq_pulse; +} + +pulse(mc_split_rd_rq){ + printf("MC SPLIT RD RQ\n"); + return mc_rd_rq_pulse; +} + +pulse(mc_wr_rq_pulse){ + printf("MC WR RQ PULSE\n"); + set_mc_rd(0); // 7-9 + set_mc_wr(1); // 7-9 + return mc_rq_pulse; +} + +pulse(mc_split_wr_rq){ + printf("MC SPLIT WR RQ\n"); + return mc_wr_rq_pulse; +} + +pulse(mc_rd_wr_rs_pulse){ + printf("MC RD/WR RS PULSE\n"); + return apr.mc_split_cyc_sync ? mc_split_wr_rq : mc_wr_rs; +} + +/* + * Keys + */ + +pulse(key_rd_wr_ret){ + printf("KEY RD WR RET\n"); + apr.key_rd_wr = 0; // 5-2 +// apr.ex_ill_op = 0; // ?? not found on 5-13 + return kt4; // 5-2 +} + +pulse(key_rd){ + printf("KEY RD\n"); + apr.key_rd_wr = 1; // 5-2 + mc_rst1_ret = key_rd_wr_ret; + return mc_rd_rq_pulse; +} + +pulse(key_wr){ + printf("KEY WR\n"); + apr.key_rd_wr = 1; // 5-2 + apr.mb = apr.ar; // 6-3 + mc_rst1_ret = key_rd_wr_ret; + return mc_wr_rq_pulse; +} + +pulse(key_go){ + printf("KEY GO\n"); + apr.run = 1; + apr.key_ex_st = 0; + apr.key_dep_st = 0; + apr.key_ex_sync = 0; + apr.key_dep_sync = 0; + return NULL; +} + +pulse(kt4){ + printf("KT4\n"); + if(apr.run && + (apr.key_ex || apr.key_ex_next || apr.key_dep || apr.key_dep_next)) + return key_go; // 5-2 + // TODO check repeat switch + return NULL; +} + +pulse(kt3){ + printf("KT3\n"); + if(apr.key_readin || apr.key_start) + apr.pc = apr.ma; // 5-12 + if(apr.key_execute && !apr.run){ + apr.mb = apr.ar; // 6-3 + // TODO: go to KT4 to check repeat (when processor is idle) + return it1a; // 5-3 + } + if(apr.key_ex || apr.key_ex_next) + return key_rd; // 5-2 + if(apr.key_dep || apr.key_dep_next) + return key_wr; // 5-2 + if(apr.key_start || apr.key_readin || apr.key_inst_cont) + return key_go; // 5-4 + return NULL; +} + +#define KEY_MANUAL (apr.key_readin || apr.key_start || apr.key_inst_cont ||\ + apr.key_mem_cont || apr.key_ex || apr.key_dep ||\ + apr.key_ex_next || apr.key_dep_next || apr.key_execute ||\ + apr.key_io_reset) + +pulse(kt12){ + printf("KT1,2\n"); + if(apr.key_io_reset) + mr_start(); // 5-2 + if(KEY_MANUAL && !apr.key_mem_cont) + mr_clr(); // 5-2 + if(!(apr.key_readin || apr.key_inst_cont || apr.key_mem_cont)) + set_key_rim_sbr(0); // 5-2 + + if(apr.key_readin){ + set_key_rim_sbr(1); // 5-2 + apr.ma = apr.mas; + } + if(apr.key_start) + apr.ma = apr.mas; + if(apr.key_execute && !apr.run) + apr.ar = apr.data; + if(apr.key_ex) + apr.ma = apr.mas; + if(apr.key_ex_next) + apr.ma = (apr.ma+1)&0777777; + if(apr.key_dep){ + apr.ma = apr.mas; + apr.ar = apr.data; + } + if(apr.key_dep_next){ + apr.ma = (apr.ma+1)&0777777; + apr.ar = apr.data; + } + + if(apr.key_mem_cont && apr.mc_stop) + return mc_rs_t0; + if(KEY_MANUAL && apr.mc_stop && apr.mc_stop_sync && !apr.key_mem_cont){ + /* Finish rd/wr which should stop the processor. + * Set flag to continue at KT3 */ + extpulse |= 2; + return mc_wr_rs; + } + return kt3; // 5-2 +} + +pulse(kt0a){ + printf("KT0A\n"); + apr.key_ex_st = 0; // 5-1 + apr.key_dep_st = 0; // 5-1 + apr.key_ex_sync = apr.key_ex || apr.key_ex_next; // 5-1 + apr.key_dep_sync = apr.key_dep || apr.key_dep_next; // 5-1 + if(!apr.run || apr.key_mem_cont) + return kt12; // 5-2 + return NULL; +} + +pulse(kt0){ + printf("KT0\n"); + return kt0a; // 5-2 +} + +pulse(key_manual){ + printf("KEY MANUAL\n"); + return kt0; // 5-2 +} + +pulse(mai_addr_ack){ + printf("MAI ADDR ACK\n"); + return mc_addr_ack; +} + +pulse(mai_rd_rs){ + printf("MAI RD RS\n"); + apr.mb = membus1; + if(apr.ma == apr.mas) + apr.mi = apr.mb; // 7-7 + if(!apr.mc_stop) + return mc_rs_t0; + return NULL; +} + +void* +aprmain(void *p) +{ + mr_pwr_clr(); + while(apr.sw_power){ + if(extpulse & 1){ + if(nextpulse) + printf("whaa: cpu wasn't idle\n"); + extpulse &= ~1; + nextpulse = key_manual; + } + if(nextpulse) + nextpulse = nextpulse(); + else if(membus0 & MEMBUS_MAI_ADDR_ACK){ + membus0 &= ~MEMBUS_MAI_ADDR_ACK; + extpulse &= ~4; + nextpulse = mai_addr_ack; + }else if(membus0 & MEMBUS_MAI_RD_RS){ + membus0 &= ~MEMBUS_MAI_RD_RS; + nextpulse = mai_rd_rs; + }else if(extpulse & 2){ + /* continue at KT3 after finishing rd/wr from a stop */ + extpulse &= ~2; + nextpulse = kt3; + }else if(extpulse & 4){ + extpulse &= ~4; + if(apr.mc_rq && !apr.mc_stop) + nextpulse = mc_non_exist_mem; + } + } + printf("power off\n"); + return NULL; +} diff --git a/extra_panel.png b/extra_panel.png new file mode 100644 index 0000000000000000000000000000000000000000..bd1ec027cb74c9716495ee5785e3f8a278eb0e34 GIT binary patch literal 5686 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 literal 0 HcmV?d00001 diff --git a/ind_panel.png b/ind_panel.png new file mode 100644 index 0000000000000000000000000000000000000000..0c1a40c153794f9a3d759f5d046fccd9b97228ed GIT binary patch literal 29121 zcmeFZby!tv*FL%kK@3ttq!kd5Qo0e8Qb3fD4pHguR8%??36)Yn6r`l3TR=p*q)VDb zH)l+6>)yZboO6ADpX>N~?QQILtvR3hJY(E7roXbH%;^)9Cr~KVX*pSG6%^_i{1Vl6 z90&eM%4%T`|H3g;kda0mApc7!O$moT!LydVYllJ+SEEoQei-_On^)iuaqZ=9Uc((a zL3Ns!XEp9t5d0Cf$sG-QDJu&LV@u?NP$(%|V*`8Rdvs1F_7CY~p#Q|Bz#{Q8;NOICk6%5a_q&8853hCqdw3m=~2hGAD-o7mkS=1+O> zJ?88W)RgyP_sTfE-DHLP ze}nV?={3lv_d(yBUfW(=-I_~r=MfRfnkB8Rt+EOVK6J-NKQ}hYqbk~x6`se% zg%F7E62ezFI5?z+EC!IWWjV~MUDC=wm6w-?`ahXE zCX`N3ffX(Mn#*QX8YN+A$q^6`KuAdFot4FPhK$T`cN0w^<}QF6==UM2hxjB53yb07 z`bd$tZsGHrv-9)8)9oqe#l>lF-MaN-+TO7RtD@2eH`|~ZCq~4Dn3|e8wdPGk#IeBI z$7bCbf+F2*ZI5#vw2U@!mUqMm8)rU~~6c-m4eo9Kh{`m1@mc}JR6=jpsg?%05 zILQh}qwKE|V&A!QM}K{;cl2^jZ_wIoHx}yMyLVY;-5eCBaPY~9ZgDm>G)UgOc{($T z$#*QXQeVQtg8jWxe8#4`g2Kt&-QBR**kF38j%j;_@#EM7&KlW%dcaOMRD-?7CAHgyzAEsd0f>4vqlE+KYdadBdP zK3U@R;Hn>QrFKLI$H(tI@%1$t|N1;&ikyaqrqCJ9AR;2d!(C=nAM&)*l$5r(s7R6! z`}kuNKR#x3gii@Uuw3bGPt*ojPT_ivPPb?(VB4R~~$? zsS7?=yLCxN<|Mjt%#K$EN3-PEv11xp`WS<5i=wKd5gXDu^PFUyx|bq1OibJ#Wv~Up z|HC&Sfv%aBEoPoJ_p|sf%LBG}TFpRp&s|Z^U4i?}ub+PYe7SZ?CWzwE@^It!XvWWYlS&M3-&Pq!n6^JdR#^o{{*}c>-PZ`aBl<;Kq;_Et`5q zO+BsGC;3mJ^ZxIX(alXwQupsqdKY0TmzB!7wV4=*=*)XftVo%mHP_?Ek9q8Jf|i!7 zi|cWGFkt7yZqJ&vyQKH$XyQkrgl{P;qfkAiZUqBI=aiI`UPeWk@$JLTfsILb{ydhj z(?YI-wwkJ{L0!;UWCOidj7^nyfByV=Pqq>6^2!RSk#3G7#-iopcg_>GgMCZ;0wx=kKO{c^=ZvHT5 zOKJT2)mt~yS2t6}-aa=KJvBb=M=L#%nwn}oT7##Wi8_UcSNW?oG23Iuu{IjcV~|1= z$J^3Uohx=%#ojLyUsE^A$P=_?o_**Law^H$$jAu2P`sE*_9mCPulWr>25M_-3*U*W zyK$53%o#tA+LttD&)w&2?d+g@iqTD`w(b6Sk*pBKASy~t>$yq4>MA-jGlN1wk>{ce z{`&Q6mYD?|drMT5(FX2=d6cg6$T9S8<-N=FLPC@#CMKzR$9|c+PZ&*^iz4?)Ndd*H zQmty@KUET+(InqCH6Y*w6xXWydR*A4UE^-V*ciOLycgNo;pD5%`^c!Nkr9)S*vxdW z)Ka{7@gnP91F<{0mi%=rEmpepEkbM_e*WsFCNqhe?g6T^vgrM8uRZcO*BO>FKqr)9ute3h*83_`($*HIiGu?>x#-(xA|8rkUzT!2rndKRpcazCn z-woio7(S@+BYJ3NCZ(!MdiCnnn#=du+ihDkwzNC9caI-cb*a&he`@(>1?|SBmE`*6 z{e%vDI!4B0!NI|W2m3p<#*gVL+S_mE{QHKoaT87!6%`rw_WrASXK8U>xPT2cs=vUh zp3`efLDg_RqdY8KZ^V!2e3sRa7^-5h)J^qV|C1-!7cN{72zJ?8p3o?BFSO2<9plX_$0jxl3E!(31{lMmY&L4f7jU>XBmX^m)pRR2PXC|Vg zOf52c+O>f@(5#vq=b{;)4l7t)jYZC>3mwC^@F%S1V>$`wDMdwVzcdDElcuma%Xcq( zXS}Jo_u#=;PK#Kz4}sY6gfy#r&dvhYL#RGBpd&(K)7B1K>W=fVgp+N=8DsUKMqQuo zUSwml(@>gC4v?0{nyE+%>v37C#6>qS$3MJ`A?v~Ur#_QJxwyF{rl+62dGqEH8ch_{ z)U>iwOx52jSQ$nyRipbc-}3yV5N^J*$GaE(KD5KOExZ8pVeXFPfT}y+W199K*#ufAQj1j<@%@D8gR94)F6k zUVN_a>)|(PO~>eu)deqYY!tjH4`;ghnC>{Bh1XPi$=P=KG{}}Tp;hpX4U4iSB`3#1 z;nRrx%E~B-Y0T#!A{r1(t_evue}N}K6Ke6h9y!GBS?bMXcs#Q2&9~_15iZlDP(Y6D zjOYy%G12q)7a1Ly6k|SoEVD;&0IZIGMoCGG1C_LN2V0rhN5*jXqdzaTQr5)~_#x(f z2m;S8>iat-FfIwuQgDtjB8%XLVTC#Rq~YGxYuApEv1>j7#1?&n>DQWTO>OO4SQi8l zT3PwFKCA&`Bd9Me{YzffJ?g-3{14(|q={d16;)ADp*xNVeKDbXwzZ=psnlkfDVh2nOA^n?$qC;i zef>I)kgzamcT^nb;aTQ`vs_i?u|r5i^vIut850F1@z$L?PrSWRPo6$~o0UZfyQQFb zhmMHIgMS%2wBeqi;Ruc6(y*j?PZkE$VQCo|TofHMGcHuILeD)RXv4=*qe|>`|3ZH; zQoC!JUbQPN;-N2I5EqwUF|0YBo0s=CHT48NJw3(cd$Q%VY^o|Mk2^ZSE2{ z6xTzZ3B$Yr<_|ncLIh6t<~#^&f@ai}sYihF3kayn&?(mEq7cxKmM*>VdibrI)*sNv z&Q$qxU|?in0Y6sJH#L>@TQs-S6+DS#=VOxIDJdz1A*)pH^72R#3}|MSvm-3NH?7nP z;9KutyL+?zV5eNH_^KL6o0^Eo$$f7nULPSZ-@F#THhVjudqEm~ zQ2!wCR#{ow7D73QObAH4Igl-2Y-|i5KX*ss1gfm8%uzf~Vh~rZuYeE*2s*Lnf$Ztp z+FAtCInMRGr7*L#y?hD>t1DeAWpi-*jfhw>@wMp{w~d9`s;4Ip%K+2ht1Ax-;pC0F zNB+S{ruD`4(<(_RDPz?H;!mJm>*(kda2FI5oM&RXo?VlX$+9+=`sq{6Xl)?ebXpNQ zg4sFud+)v^+m6q|dinC!+dSugA;O=Y%gf7QuU_GyK79NrX=1|iNsSF#^2farJUl!{ z(cPpeLS0?m&B-@b!y_XjO9fY@q>!cj@#BYQuzF*E|2Yc_i-)GBk3&O4N4J+(kYmTt zMg!D_g5Q$r89sFYKwCiLnY!uIOl$HUVV`qyV0UAq1gwX>4ddx~sl?nVfS+75G5Kit z2_CVmoLnVaX36Mk=^DR@ySI`5yVWfKvESmwX_0n)qa?Fzo0UVmkdDbcY4#z#u8Vud zq+cI8KR0)Ht~Y0Mxrx(FBvU;@ds=z4Tkp#(I=OaBUt#IgOE%O*|C{s&pVZcIGbTT} zdp=|zWR7#je8Xn}Tmu`3%3NH|yqALzH9UOlwHei$b$?*vXx2V_^z%1w0^w;0iEIq} z5MWBgGod0zdEYe4%F3cpz=e|DzlS@=to9{P*VgkaJFHKASAf8LN=QJVvfMT-i|hH~ z;^I8iLhK5XJi-7jo=BLL{{m(9-o1MQ^H-9d!L9|CfCV^d^s))E7S4NX-8Pfo&Xz1y zoeWq^FP9s`qEa}M+`_3_LJ`HOSNGvo;+=CwE+w$lkkYJx>g{U1TC%*U-At4>cKXDL zD!@}z#NHW(gGF{Jrh0T2*EThC?gv+Qs%X9@zzTMEyYi+v`m*tf%U7=O^2aT^up;Dv zpNR>Fo0}WI{z1a*OrFQiI>xUrwzry&pd}RpH#d>Lzkh(2*=UWwhiAr!sXIo+L!PRK zJdVX>^X~qBAB3$+&^Y*10^Ux8E;73eZ@+w@1p3Wcx=PHUR~A$-&6Q3BO`U-8bJ zGh+LjMgYb}fkkf)Zj|{J*-aUaR6Vt}v#UO5Rr2WYBeWJ47NUXgd7=aLD$M!Li;2-F ziLRYNAM%|vb&#qAj+9p+hfhOR*+A2e8;P7Uf_g+RfGPx9~THTuQc^Mvl-jmLu z3(h)HSw&rW@~wt4C}w{a**$;x@=1&M!Ov;8S*x~9bK0e3#(=gdTDLiFDpA)nc9Y*) zZQ z+!BdsAxN)fD?OPDbO=^*E-qXwpXHyf^GvEAOKbL7*}FTowA9qWxw$;YAA3K0hEr_! zl(TH}YTi0(d4(DkFvSkFJRPtGRH{)}S#+pli;Rqn(ZT-Ss2A)D4zH<9uRS(sQruR9 zBD*65UJ?M9f#!q`0rVUdg4?KkE9Gnb>j(Yrw31hqx}L{VXuIZpxp;2tbCm!>0fL08 z>$)5RqIV|Ti!VDn+j+5cV+mO9$b7-jvs%MSpmKflZo&Tk*>0TI6I%^l^_r`>4?*>I zq%2m`bRcZ4sKibKQ;WfpIq&X7Oj zv^aR$r_!6-sP5r?v6GLzfkQjHxR_i%DmrANr}6Qhb(+>@8C1K9WOlacgmR`g-lQ^S3si4pm@mh27kYA8ZWU(bj7wUh&x z_6rRqKM;1`%xW4EwEsouxxW%`1cVgnWzpP5OS5_hlmJVvnwgn(y z9)pd$xxY~!3UGV0pnQ*=&!X=M?ZIZfUvRL4-xla3z!S(21>xyQ@^?i=X9+}>BnlQC zzJ}2+t*?_EoD;JDFnT$8gS|9Nip7!Pop2?wK6w(OHV|r=5UR>UHWD6rdv9;itA4Wi z4QzdE)bUfNq#Yc1ffb6`cqH4FET%GhgqeFhi)7b&zuf~{h&D|vz3S85oHHa3;d5ME zTsAv1J(D*FAN%<5iaLpH4rAp)nTO`+I3$t^Y8YOq$gGQpzF4K4}Hq_dR0d&539t(QXX{f+F>GK5RD|f`i za|;i?++JH-TUuH1iHeHSX)6|A;7GR*BFC<@jJtmAn*Y=Z(9hIL%d=M9Wu{A>`h6$} zrV*u_pPv`79X}3TbMo6OA3!?AE$na~#I)sGlW&&R)*QBl`K<=+H%G6&zLXQIM@EhK;>!JRs2>gvL-07Qx0a3Jwy&cF5K=xB=Z256p6y~s&I~N(qm&e8O-;?Yu2P5D zNas^wn2#NBcq0_x&Cn_i$@rzqWV`v&Su*qb+Ok+C{Ow#QKVd79h?RoKOA zK-J*a2yOqQTS^J1==!~TNt?SMQyAoF*4DS#rVY+yCw1V;4c6DI#=qT<3=5;$_{tYn|$?gM%SD#f~FG2YW;FUD=Ea-Wk|>4<4kn4{i0fcs`>RcGU05 zGH?dQ)Y{YIC+fCdq0i-~_wZY+u=?Di65}Q^?LuqGU4~mJ?IZCATk#{4las4~*J2f! zna*0wGh$0h06)t&?|pnbMbV(@30|T5)@7tY;gK*615B22cQ1(+!2Yt0m!F^C$DYF; zRlW$vMv4$SDw~98?F`^OkWoTt#Y67q+<*J&)3=c~+n+vNDuHJ%d*jBF&`<*JjB}Jd zfZ%&$Wfhvz2VG~`@p*`z2Vw_^+-2|@RO6GnHwNNFem)-$FRy>SaYCAdl-@@89ickr z3m1lK{7FWI^6jvviyo_ecY1kL2j=?=&_ARI=r3M84iygR_-UyZSy&|HdHeUO6pVDiqNpC5t zeD|0{_e}`^cIfu_{WIsU2YGjzUi0)6qokx<0<05ITDABxXJb#th?xNsWR(WBDpd^) zznK}+-AVrP$`_0Z%23fODkN-57aI4gs;g~Qf89c(VaF*UHFbCwIsCV0Qt>ouzB~iw~ zYa07*qIbK(yRAuuiEb$&jG^R7lVd$g^8V@N*u30tE$dFBV`H_(%eHI`4BNOanAbeV zh&}yn7imJ>+6GamL$+!Z+BI+SU4Eg!qMwOlWpy=ISY0_y)H{tkA`Uhz_ze~H*uc$9 z0z@7$C`B$QoMD(TGaZUfP66t0md(icQ&2?qWwp9KnQVMMpUc2j_um3NH7*I-&=p#; zc0bEGHnIN*Q3tlW6K=19u}LKRNcf8vn39D0 zmtRF|6xR2Kln)LLMvHj}fx1dWN_s3-F{Qy7u<*l;oZ`L3e|aBJZ*#Q@GFt?bGTF;V z@KG=SX}ZV2jtQ7;`hAsd{|ke|L{VR#j`G|&>I@ztYz)BfRCH}6F)>sf9UV(2%xner zDNo_R${KF3PQMN=06Gn2Jxc-grSAY3NkvNwL2qv_&}+ZyFCH%6>Aft9{=;VjvK#+> zEq|{TxI%%hdA!aMK*Q zGM{6BL82|xGbd%} zw!3Nb?KSU7fOxNC2p-cVynm0AoSY2HG8)m7v0e^UPQuRa3gRJ!gy8!+>@3Gf?f2Qj z215kS+qX&F-QCZ0N5%hD8>$Lz#<=W%DaQ!f;h?fy*GzBne^j3ldWX#1^9wNwuc>8)v;KYt$D0si>Z zRA5t5Hf9C5K0$eA-KM{n2ppC>ym!stWTMe%{3g%|-#1u%@9rkw-`_WU+}KHV%Z&r~ z*s&4VG68rJF4L*(_j#wDsDx(nnso`R`gJsJ;!7{@MS)8GlI1q&8y}0%FRhMNW}<#* zbkq=~M3@z3SBP;hT{jkLyJkLfU`w#Jd>T)DzWu=Vr$R*cK&a1 zgGm<}iHh92oXebAMe(cE{^=#D85#IcEa4~E!yc45DlKoJMxe2##~Z?JrrQ{E3kuT2 z%Kps<0g$t0=#~bAg%LJ?!!vOo2+kv$w6eG70jOF7I(Y2~^MNmlri^FghyAR(b*!Sda5z2=1jr^xkB?QLc1CjBq| zUwL6Qx3=duwWc^xH!fgwR6_Q$Yv_phe%bm}fQY~^WK>jMFlosmz3x^EG||T;7h2cf zDr!z9+o#BzxO4*jfr@^dmX;Q@oI)k>VYW4@7xMD*Re%hrEKj|C2Ds<~6VqtN$J+tf zT^$|zn@c0scI|^_<{LE3B!N6$B0C8>A`S`;7!K4Bru9}^-j+_v?jyS8AS{#173JgO z189}oyoalJLi3W&d`5j#*E*>@p1I45Q81;D%hc4Qv>Yl+FPc~C%TZMLQw$ad5R7DM z%6f?`aG>m_f>V^3^)M>VYu^Rh!Uvkbk|#Q;a6o6f(xt$bb{0W=vUiVs@g&H{8T}=? zJ4I)^Go3cWnD??c*)!Xw?MGLZYZR<(yX<6V{(2~?wEh3KSKf_-H4938>v+j8xXDL! z$Cp-D&(PxH;JnMuZl!9_Xy879 zXI`;?GJ0dsjR4rr2hj9@O(z#|N392S{(Z1+{4=w&BU4kjATSquyop@k7yum=@L1OvhzJQQ!ljTK#0U^YEh<}DX6UfIh9d&|bbjH^Sz=<$w9Wv) znPU@CdJ9p7+G|vw@0Pg>Msn(9_}ko&l_fkE#8$h#ITktw_ul=jyqKpfE{GS^=_btt zElEU#3R=>cs9I(x4o6qy&s$k| ztO3eIA`hS$0L{F6dqw?k9bX)PIt5V+LhQ-~dD~>8{622e5%~=`S|Ynk)d4LIj*jm@ zT?2K!8t5#k71uRHcI&Ih*5{{{NM`i+_P9&_Lv?|9@h0dtPx*)3NkF>78l9n|j3Fi_ zMr_SuV?fgQAWOR_Ch;X>=dYfm=r7C5$;na5%y|E(;g7uex%jpAbaXlyEV27aGe5qE zbY2}u(k)^;p9W69LNL$6VFSFZlglrpE6P4Ky;^A0^53pbk_(643j40`#&qLpVa}wAM9<65qND@>v;86ZB;m*J#2LYCp9o{NK3yqoP7&` zm(SOj4=Nfobm!^hDC>zv(jZFS04y2g%caL_5=t<`{QNpvhtw~?qc9z1I&t_H(wcR| z!@8TOM)*tw=tk9_M9}Qv=bMmnzOk-?OL_MWGmwn^s79740GrAkXnxjnY+p=q9HWu3{e+y`&!w`)^8mixNCzz3JW5HcMC zF3T4z2TM!}ES;vPN+n$t8G@4&6RVA5Y_DCrrcq!?4eq)#6*JU=HVP(GEFm@qDJf~R zs9S#FH*-Ftz3nxW_lFM`=lb$a;`mgKIC*$@j4Uo%IgMW0(?MAurfqg~hKg*tKBT5r z1)aSzCq{?&7zM(Lq67oxaP+6MeC8AnPi!k| z{n5eQ%*5nTd^|1K1Kjt%68bvm#M-UmObhypkg3~b+|8+52)xn1azE!R1_nk*@XdD#Knge0&2d0S3Gm(%627&*fCIZ)#h6ZBWE(`VofsmQz1yt>FDn)~5WEInc((P( zRrlov=G2;kjax!{;@!n0VMcSBo&RniI`Tj`6PSM@sUIoP! zkqsdpMb&lg^1b5_GeMTf8Kf2w92BUvi025zQcO(jwLn=g1vh4Mb8}CL%N5|IR9y}Z z-&@ZmOl(5_{fnwWU{Al`!v>a&Rdh2Pusf0#-GiA-y75~H~cFln5JF>LNCd2JLc zAEI*hbs7=S<>K6z<=jEySL|No%zr^2tB4DcE+n3T;`$Q{D%zr>Zd$1O^6Aql0H^Bd z(r9Sk0*-Uh)ubx&q94p{fKm~I&y^aSS>iMa*f-m8UK1XHP>m}{9ja4EA^#pH8VE^% zwh=)WFD0#Srr+_@MN3~!7WR#?b#^zrF6$9Tt$XO@@%&k?Y3|(r>C6v)dvyhTeZM-Gu}^ZI>m{xO?bR)|zWz2O%4Ux+RQTPH@`iw58| zvQ|KlD!`RS+3T<~Q%70!=bP9n%GQ4_&ekn)=0=1vutYx+n*lpcO-rK|OJG?`_*`3R zH>Ie$SjD;+3th?|Bsw}c4)k4hb=O6TOP5YPefpF_+*9Nk0WC+QMqi_mIjwSgTiXxll8a8C zBi5-jKi~7Oju4elH(7?XN+1|=S~h$8W#_ZqznMGjeEarI8WNmfA)JrY3^~WIc*QP} z*{BrkOYk_M&R@?HsIID_dOiMIrF{K!a=i2k=r&8>5Q90`Y8f;DX1lI#NVl%rX#&yJ zFjF)RE^f7HUSGsEmQHD|c>`NI5T2oof4MrqV{UK{-1b>1! zb7;^zO!H|I?5QjmH#MU(RhEw^{-T61&Bn_<3-TmzqH6ad-9`NUzO2-pvl>R=O}|w+ zdt7}fy6&9wRIJlnNMQT>n^Le<%eE%Z)uz2BAt7n~`7;Rec8Kb(9Ty&s1sT1cWgh2n z@u@0=7fa4BB$`{$>$*-eYL~g6wJP6pEI>Evr9gdv=84$k@LBi2ML&XCY542MTgSy) z(|d4Usl32`ncw$>P{N?|*lG7&bp0kss!u>F#m2#50PPJiE*%$s`omXW()n^mP*707 zZT%ADK@h1P@wlOcd^Y?B&;@^y6JoESV%r}K&B32zC@C!!l=PRaLA=Q*S-1=X@Pfe6 z1cH9)+_`hLHBVIhb-ex$TH==LsTUslYS%JeLj9vL&>O>#$(pX09ckT{FxD4`LO}vZ zBYWWNTv&aXeM95r#&;+HVruD{PeIgPbF=-z49-if@cs2CukET-l{nd1Sy`*TILs=m zt23{s<$6ehScg-iD!13Vv1Zv&zz*5AM~)&3A7h1`Oqme17g9BBAo|VJZZ-=`9^t>L((4v`yrsb~7Y1HnaRhLAH7cmbIpg`2H3GN-5G z%UOCN6Y@-yJ;UEj8f2-10B#t-#{!Bx(|uOh@ssn@h}1#m~U78XzcYO#8|0L)Ab69cPuzG)JcPBo{cfIIMemUK*MGq#M$WR z=_{v&04BbUCdi0Xpal(V+@r|cM$XL%^1l{%RItDh5<)5OK9*o}ZJSbUMyiF%O#l02 zXWTxtGu;bajEl5N3=HZ3#Ihm92+^Za_3~{}fZ8>C8Gt#QdEMRIgn={%Lm*f(rQKis zJ=7~OKsy%X^8iN*t-9!ZzK4ezW)|PVgJ^mdzVSo%IHihS~WY#EDLFbq*KBtat!Q+f;e{dOkX-y6~I+hRaNvVD7M4t-+JmE|KUtx+s-Qym&;()QR%KEN9hui_-B?Z2RQQ%mhaD& z2k<|E)PeJ_x4z1^Z~OH1Y3?o_>~lhYo7>iN;^+HqPRn#*Z{a(_d6a_%JNC_1`+Y*A77b4JJ2$9}RI z5E>Id*lIx|o_guVU^SF9pQ@^>X!$*e1-vUMp^^!usV#9?u?7K^MyGahWCR1i8Cu+g zG>q=JM(#r*SOH%oqzGB{(Pk_Q*dpxvPJra1;*ntP{)+ekNxb_q9^#jSqRha~ei}Ku z)SfM!JI~7}p-(I!CliTI1ag-70T38&m7yg)Pk6V2#JGNfj>Dz0WGAdEfcc_Q)dSc@J0mAW3fLoMed0!`0zHlqg>d z5*8yxQ*l!80r=EHPvZCH9yslNDXFaMseKhrg>sEr`o1{3&S15qU4qWtyvVe4wsLyBY=%L{w7b#N+jh~B6Gld0Q zyo21RKYmBMu2JJ3Yiilh6X}T zxjlECn|YE7YWYD{gcK4)!ez{>+yK%y2QQjsmOcY{=M;pN@mp9*aT(GD+&8(pGIY$k z?+6`*EfvcNhhxfi?qNTl-<6dfz;iDJk3$Cdg&ZhXt%w1=eH zz(8$0N?A?qzSFD=I|Sz>jf~DOlplEdPQ4t2g@<}?2*H=HEiL3x;1LDdso_nnIw@TL zQF_yLmzUzyhojgyY4^OP)*JzpGdPjY2B^reB};C<*Y@xb1zs@>Gz=mG3`Zk4(tvD^ zu2L5gIKaLYMc(E${408C$RNR%gq8#BdJZzjoBc!k&zy!l)UTlLKX_oY`m1#ls+PdW zLkVye{+T5x#;yh7m+;J)8jKmAd)Nd0N%aNbj-XJV)Y3-3X!ek$9Zet<3&uch02&_T z2HMc~zWohik5uB))-cDrw`Jm0JUVkEV+le6@%N<8kKSIqVOn)klsAlC3@EXO)iLYA z_6hm*>)|EsLgm{=A^6{tpY4yU|TZZfvmF zi4*ZMl*G2ABhayec1(PhKQDgAec-VU-8C#G<`m?H9A>*dUM>Ss2ND4_P#|iuza7r9 zyiZl97QC&gc>*>t;C7o!Y;0`V&S=Bpt+x?qRr%|ulJq_ zc6;eRb3I`yGmsU|OH9N9<=S~7Lj8`v!~X7;MxH4tgo-A3MpBZC-2andmMO5)Zbmyq z2K^A4UMJX1d_axroJxyv|LtCgmhtlNBpiha<2|=oK=bD1CpRy}{TtatRs0cLs~7(h z$*e~*`KY}Y%I6*)%?J({q}*pdaRTOQi=7tp-OR_Pr$2t|zuGjmvaum!W0O7b876(2 z>-yU_65jur`Kiv3hN+N`_${2;g@jWr@xJBd<*eB_AnL~9_eP*LrknD{9bZ-uhvU>6`j(^bZK@*##-Z##(E){tGtkI z_HkL6904p9uqboV*4DO$U_%~BH~wo*D9;&+5%kN=DtbBk#p!#2JK6O#)xZk4LAbaX zRG<G!;fLncYv6~? zqwfgi%N4Lg3{kTL%fjupP+bEEz6Jwd96qF_&91FHDrOX25H>r1h#;`YNxTOxTo|8t zv3wbN7^fj*C?WQ@K&i~n4?8i?1B;E7m5`WtblGYhC%O2(K z-&9nrdv^L93I$Xa$^C)X-M*1X`hA;GPIP~B>?;&PbMsH8Hi!1NU1$3=oX`qjblG66 ztB&3T_Ylmnr3x$pl=Z-a7O+G(ISHWor`E6z-Tym)iqc{1fd*|js`3%LKwR{%l|4K) z)jhv$8k(v7r{C6a>W$-_NN2p0BziZGFYb?y&_DPx#KtzCqWS(6OiWB3?(c15W$rhS ziSmcTMg$d>ii6eF)$@&v6N>R-!7R7m_pqPD!;^&W?73M@I|`3V7|aw$8Lt(~JF2Q9 zU~)QU+iz&XLWDCbA=dK`FynqZYB)a}7?C{8j=j5`t?klMH38Ny`4|XhAXBD`GB?|F zRWi02doSsgQ8h(zs*4V8ZaVuKx5X*874B>Yw8VvE2B(R+!AIZExtr%Kb(rg`wYU!> z4~T{el6S2`T?qBbw9XS1Wi_@yLH9h3Rd3ulWoT$fRoBKBn#WgW`#0dYIT2XWlKdJk zV!>6y)Iwz9NX8v}lwZn1JvI)S1WZ7B!*MYHN*tiqv&z3^qbKwp0h~NbS`+x!{>cKM zPgGcnU1(5f7&i_;5dZm5k)p`NSfVO*|10#(dfS)%n_UZvPA{V21*8mTGY z)V&Q!OL9b&0g>!fPqBAfsZ?3>=JqzG_a;deXJuJCvGxn<5Bmq?*lnD6=6ENxUX`-H zU9LLG`9afF>F1!U>o>Rc-Up;wydSQ4{_IvUN3O2pWPF+c_IH*D1^K2k5W+l%AVio2 z&e{>xBH-21lQ6-{N+bSOJn`v5UP@;29a9!|y;%Z?c3y`8?EBwidJ~DY7Ud^He{bab7`nD0$38|M_HKEXk{Nj)@P@4>DeA&Xo?sV`%NqP;o? z9tx^?Pq|ll^&%ul=>ft?sIR!Hd*$#KvdTHEYqo8SrgnVJtnX$z%GHk=ZSByv5pVG! z4XH4_Up`AFn9^9?P;LNVAce5wB@mDB09wG94tz_`K#>4=u0ZCFErmX5?AG&Yt{hu` zzrEh2bGNW$PLpj)I!7={-P zT;VKFi?3K3*%uR@xb#$}ucA}~Uw z&nxvSo?sLG=;(L?#|8-~fszeVZ%D8cjt06-fm3h}D`|=h#-to)`9Q`P+MgdnvS{#< z0E7N~3&&C}w^?WNe(`ir`(a|B5>6`hATF{Lr?pE?W|070L)5ym-DQR130wl28Ypnq z%j0tP_V(5ZWj=`D8Sk-v7DTh#a+So40P)os}YUM2J%-(fKEwdo$7dDa@ST?Ejw0}={O?+wtgNhr zuowlOd32#UGWKd|SqHimuPUbbJnA$h|QF zelzD6&%Ipsz0CVL^Lb=8AQAi%80>)d+x~4|a$jQ}{qi3O85{8gG_ErUEK*RYhNZ@+ zuoQpawFA!ZpYdqY4I*G}g^)uZUHpnH-}d%)-`<>s{0{SjMIYqh;xGZnIF65h9b$O{ za*O{R#eW^ZFD!fxI5^51@Z`Jn^qcOAfys8jCZ3d+ivwS&HHPK}-vE)lHnb|G()0?{ zHdWp~d}E^h(2k=Ow8aMIbwO#A~=2W9&ZHhq_`8iH3bBqb#!z&l0sJl052J@fS)uC)1Lu;uYV!Yg!LV@2t=CCR~} z!HCC*6OSf=ChG^kYAw#z4mtuNqYR_b7J?`XbU}0h1($NXtStxF?EK(t0)%ppMf*MF4 zsTQ{<9=%(j7CR!hB~AocHb3=|k07U3a@=B%PlIs7^~CJ{JvlEX_M|lF?Gz^k&@Ou#Ff&*#ApviRtI2dP-jJWqqb+_fqEEPOXY#sI6@*5aXS7*^hPwjP-lv>1!rSjbmE_ht>I$8^B^a%;(m8WADEimCdre`LEasN4QCd<0Ja%Ue%f=~*@#X&$iI6WuH>qR~eiMcdzh6e+n`Gb>Vg}(=P=RaaTkgh-f=+t; zaY7%pLo(w_$VVJMc~Z*2fW9u2HWa*S;g|Xwx!47nKVie?)py@*;ol<1TGn;cG%QX_ zC9AtV-NQ6+Br{+(in_qU{eTz6WR~x1YI6*Pe%um6M){`Vy=dTF1p_n(Nr(*q69gTd zoxQPctBhM{^?64^WNUZuN2BJL=;=BC+*CN|HK)(YITe|pU!7a~z!!z#YtNJ|1ws&%-6#+w7SC#2hcW@xLV zy>t!gZH#-lO=KdesEAMFxoLpXG1fvTAIN7YdqxzvAy0uPJhXJzS#x^PLYw#3-U)X5 z^MV3|=-J2C)JUuDgg<@qq{1}M5R5EmNcnQZNDREHIY_vgJbVfR}LPP zN0R%JpS%-x%h7L+^gzWudZDDX5cPL8%o0$wXqb}QX)9D zBsjGa2L}%IOyQD;yZi9?c*onVfSthUIu-SL`Ez2;rto2((iyt%oV+ZS?o)}yDlS2C@$>ihTabNfmkK;wXkJ$MI> z0L+ndx-d)`kSu!D7Wn%G^+FJN9hx4@{Y)!y#la{aV(J2HjX{cVhe zp+bKay)Ch}vJwN}=_8o9ez$Dv=vW7s>GX`c)$F#OJf6Y0I%dZ0dN6El>vpGfu*?OtP6@R{0$nWAE`m9ym;~ALx*?Dm*CYCkR#YW zK=keWI_KdaEE1-v70Mzi} zVkpddob#Y&W=>HPbee8E28$RH67mqif-zD58x8PbR3PA;bF%1I0!^5+nh=l7aGz7#k42|D;ur(dkA7Uxd6-2r0Wz zd#-^2U;{%)=0j!F@PY~mAzu;BS1B^f)3k>h2SY&O>Qzj{`;5EC#L#PQi>d6)h`(Z7 z_AP4bvYw$Rm)@j;^y(6FIS5LHHqB){4C98*zcL5CU~p3z;M>oi+DHfuG6}x0f#FRQ zNI8OF;Iy7h;Y_0nz;~R?wVj~@8h8txecBF&J`5ObAE+8z!VVnlJz8# zg-Upbl@zATL*R8zFbG5q={fK*47DypP)#?E-ZhI^W9a<^dATi}f5gu9fM z4t)$U+SR$ zS}{=7LBW&(*A*@sq^TvyXpDSJiMtB9Bk%@}4eu9-EDV*$`&{q9v%dQHI8fGVIEJ@i z#sC;2fOKT=AJIZUck4=hki69ME;Y4rxCohzhB?3|Fbb*hlnqq21nh2L2|i zq$Fc*ehFFz*S)V{Y6w}`Pthy)q{3#Hxg&t_P+Cd~3uX_V!C|KOsRw5R0vkqaGo4Is z*TP(^%C?vwW{b?F0lTFX>B=)xhikw^_yvS61vR8Y!w~5ln9C+iTnB(U1Me)68&rn` z38-D*1DsHZymV{4pt3Cy8420;ig%eji$VrskgyH%9xZ4#*F)K%UTBFrK|G-+=K;a? z`uvVE^MU>6&!4j(hp-nlAMHvT8h|VMs`VBGaiZDmj5EGP6kS%I>{Bf2qukHC_XNZ= zB$WzJ*k|V)CFStKLI}Jw%znCRs~z`wbhICs(IfojTQ}3{Vd>}Q=hqI1iToiOPY*l< z{soTGhK-O`H=pxhR%TDDDL44C$koSXljxdTwrRdt%)`cj$mm zz5DJ@;(h(Y9aaGWfnm5kYk0|;fH%C5LHQ3bD zH23$5nP4N5fZ6z~FE4Gs41D>wkSvB9RqddS0ra4p)(LnR%ewp^Of$V}<9qu+Mq1kK z4hp1%K}8S9Jcix`?nMr-fkQ@Sp{B#@P5NhCpdwwDmGx7dk&dwf4f*}eH_xEYDu`J& zYddT~=P{@aAl-K5im-#wNQWseY^+Z&GVfT5?{A(5+cv$N_$EtULem5!Vz>Lj!Ut*$ zkNX+JtRz3Z;ewd3u<*k?P57C{aX=axznPym+o`=5F#9&=|7!0_DJm=i^ z{dt}j&%5Wv)2Ak*8O_Z9_rHGE_1*rTAH%4vcYWhOu<3?W(ija`+`r%lV0(Gn=zyJW z@I#UOatU%o8u6~%+kzCqMniqWMWYCN%??)eD$eY+fq+5E@JY2NxB(z>{}`%-8qN;~ zpvLE$*RKc9TGqgsS`5c#g@+qrFJcD{!^L-Ii!dKhpCyO+%SIZ;E`m)J+OZBP7-%L! zD&1h|JoM;{ET$7FvHY_clq->u=OL)>k*U@DY>J&0M7%jzUgN5Ra!N+==LE}X+Ks3B zF_2H{?2u~M9kbS~7G7=a6g`=x(T`rEQ^U_C=Qm)&yRict6l7@iouWTJ@~R=TVC6P? zF$u%Dqj8DQo)^7ceZG-p+u!dr(y2iqW9RP;w)+nsZkE$@w}-#`_-NtVxiPz51!J}V zn#{=YpuoUYl9K8XDiAD|Vx-1?HGx)bgKhm9mSx$F9eZp(DQ+q5oI?KNK10Jhl_O)L zqh;8~C1ohCuixcZUpgof_sdr(SQLm?5M{fnBK?-U(@gbJ6eCt(RAC(dO4W-H0-8wC zQd_YMOw3j%Mwu+U+G~A3$rHd-S#JYlgZr>KOK7F`dm;3Vz@R3krt)71Njw-E=PU5r zNP;L)pSUTEw~WHcYxjd{qE3OyzwO@1%hbzp>wC+GPmGfS_vbV7nTO6FHJdAzmUTli z{g5tUJ5o$@r~jM<*6w|U&{c4)*`q+1Mm{1)NeBxQQ91s|n4yfvoJGPHDQO|}1y^B* zK>$cAb|`|_gM-V4!jn?n_fg`Acnks};U1Edl49G}6>0r`g1y{JJtRIQ%9{l}KwsaS zWYk00Qmz}qUV`8O;|{4(R8q=skc={{ICMWIHS%;QtiM5Gz84`e>?`4{Z1Q=;c>4V4 z5%X7VO6}82{BgQb%*Q;p&`LTzd+dMoMxU4eLQmMMm>6TSF@t_*2C0M=;9BA9QhH=M zaZFx8K^-D;5{ehV%FMXHLx$*PE`7=#&{7a94xAoq#AuB`kO2pB$#q{^Sr z^a6=Ihkl)eP-Xjg2kLgAF(3sIiEy)TazpCMh&|ULBF;e+K;X7)pSTAmifGt7&}VM# z#&+lKoU!GOen0 zqvuGZ^DUfb_#l5rh`_V34P=yt9pxi@Andh|{^d>Zh1?SL{N5itR5G)&l*RjN$F+s% zVbEUP>SC?Q3pYT!0TJPX_G!*`V9tnC&jTj5aM4a$*T2o6xs1tY1l2?jfjK8h ztw8RXpGbH@^AvUU`_bc}nj8Rb7F4+c-9>iJFE~pm2?ys1pz4d~@b$CV1j4gXJTQNT-6;|Z6TmUPGl1)NoVy`awEHPXcI`SpJ#($8LPlPG-fVKuD$Gf!{unkWPJZme zq|-whk9bAnp>XXH)<8pU)gRt4hw>GhYRLK7eYRB)Gg9H^z*?h1Q-Lx{4+pzwT|yt>P`M`5q)b*VMM` zDQ-QAuJ#4;o$#|f(D4rMEK$r!uXjucy6>~jY@;qp3uEfNUw6$ZHsK|mN4Iu>$ z1>uHO%#+ptg>na?DzIY3WgKHiAx`DhJ6lVb?FgJ%1}+@J-VrzxMc(h=$rpv93EF{Y zD1|FbDq;{eoC9og~;2>HI?u(00 z{Jnn`n%QvAbtfb)#F(K0nij#dS#a$jVbY+P(|xO*Tpp>n9yLW!n1;2Y!If{CQ)&1=;}5peJo>4I^YV77y0AW z!@8w){P^+5alw9z|Gf$Ot0R=_46w&D2b&2}ukP-jTqfMI=wBIU5u|IEmfZ0Eko)F5{*< z<0kNOL3&Nb#GKnDcm%yBrQJkuH|4ja&QJB>^)9$cZQOd0YUq60wxa3v z)m&CY$Tg$cyIOKJkptoN6E9N5Qk7NmB$mjyiAgW9%kb4xbG&~xsdMF-87A+qB6kc^ z+uPgyp(7}J`gEsXi813sQIVRht*zwiw?-l%wKWT{N#OU{vkE$fJE&AD#=1^KXhpZK zB~}8QD#ZB=kdnK9wVrmtqesYQ37{P^OhI9&O)(I|gmzukaUnJO=FNGK{{~Q30u7&) z)T3tgUGZiv@;~Z5@(&pb8)0*STDXHF_`S|13sZW1W8=+GU{t_V&Bp&|pil(Z$Tb4w zrZKaceEW(4n{;}>hKTsJvbs7_)N5k+7+xST>>@}IlE$L`CcHI^<{WE6C}}JTLtO&> zHB0=018&Z4^Zv>QkxVEwawG~#XsziL*E=Tw=aEMN;D$pq2;6PeqzA@jr!!}sbBlTV zBfOpEYZ`_|jU?i@!_$VSkPD!jI#KO&sBS7aW-|G|CEb=u2_r}9O7;`n97v1X78!EY zXg7|Qowl5@BaV1=szmDRy@OkESD%k80I}5W%2YASOot3#^31RUajgU4c;;jTp1Ix7 zIojSYsr;xuOB;_B#p;+^pL)n;%(CCv1&4Ti)zmtDN=pLTav~Q4%Fxi(m`+#12T6h= zLMC?~$hXp0vMU1fN6s}!)F(wTvS`A!(OKU7@2zsB$-?jabfd17f8MKrls0{ZQLc<5mzcWLCj4uqgFsTe_Fx3#b>Cjprz=_I1v$ zF}?Fr$Y=vRqPED(4GZ-~C^S0f0TiQ7LG#3oKQAUd;H-THt2$9*p?B;+n;Lz~4%h*@ zMaWZY;VL3CHlVNnZmD6x2uGp_Xpx#QS6rCY=@O)*NRAa&z2_o}4s}IkOk!*WZkEWT z{BKs8#8^RGOGJp*6_$_;#o-M5KDX~jPW(^9-?&$ll(clOj8{}^g$z6w@R=Y{N~vIU z=gGj2c4=Bk!yaOOKQ|ol9?@WY+Yt5cs(y^!{`~^5eQJ<%M83(}3R&akot!9(~c` zj01Au84gQvOBDj+d@6SVIopY}qpI@(IuJWt7-GfQu%su~XDh@A9r*z0-8<049sh_p7?M%|2*8q1IFHY!_b;jeF^ICG4jT#7 zzZb!o3Ag#p6!ni!lArqFiAN6Y3K72}7Y-62D#(s-WRD{`(#*IYL+voOQ$#hhleBY6 zX@D9`xz^YHd0Q_qyC~A*ANqD-y&Tc)RXN?OC8z&)eaW-5U7^`cS_yv+~HN`4XJGy6fo6;KfY#Z zXljaY+?ZozFLXIH^FU}%xf=|B{68Iv`RU%?s+zc9!AdpHo}o83n|t0rR)Ue@&b@(v zwfQJTh(&teJ0^ELBPjWg(Je~FXb#-*p3-)lbm*UWTK|1#Z#E9>*`9|Qahbyp*T!IU zR~@amkf;@|iHb;MB=LUJXoO8m;R<;-(A|LaCiL^lp5NBspl^U#+$OKZ*he^-Abi+e zu`2-=J7>(e)<83GJD4@-W{)?YldvAC^dw9Xz*A1eV#?WpmJ67)_2QHTfcDJJ7*a_Oggvip>+SjT zw)f(;$jMesoDXAcBRCQEFEuN)CF$sFoGAFdXk3*_CB#{X?2i_yf1Jpl)snd?qBh>@lGB@#9$$E%6==z;;^+gW>gs{b zSQd6RHtXr=N@38o$8iQHatR{a}$7BH(Lav4cU z>c*mbnC0c=H(u_R>%z#TMAjDUSSPrbELe&8N_0 z>zDsLFX4grtI*8c+)dEh$xelYhkYo~aiBtyG5nT(iiA+*Oy0^%;ox3Cn3{=RMkbkh zpna8quoGZ<_qhcBfB+7xHvuuRw!0G$gCF|#6TI@)c=ge-F`xFUDrJnJS0lIr3!;;5 z`o$de_`KxFXtn&(3a&Zi<4!CX#Lo2m54J`b99;9WY)qfWKbG1ed2k&%)(KVJUhQQk zboiFP(5*SdYpIwjaV!r1Skn+GELd)0qE$9Kwzyn1qTb!%Vzk9dVXcZv;a=)%Q&ucv zucf7xLXGLbvP)=V%Pn3tgl8+e9-ENy(tqMcyMQ(paist{LK0{s&>jE+yAB>Qf*rG5F)9j^r`AEDNm-$!(`wM)?% zu_ZJJuI-4lPLAvqko|^-B*Lx;k@?_otHQuR4_uUq;m4+nU4U!;vV{13OHc?J$Ki>y zQervslU)V2b@{1>dBGL5DwZC+C$QUGMnVfB`4Zq`g;25#XAKnKDHByx%AqIj*}lv3 z1bYuwn)2%=f3|b!gm~J@#xeOnOix`Gsy1eNU_%z2;7S_XKcTxp_G{j;!3=-6g&(CyZ0y`Wg+Kr+#sH$8FchDEzD8 zmjBQu>o6nz7CIhO#T8WF71+}&5_Sfp-RQ$klPbOva zSFOk_YB*Loe19;9@?E+y9qCafWm+cn0vmy5W|lPY)|UAB zkb&i8uPF&24KMv|~HVSy%ARL#cRaL=aOEG*zD6(!bSFd;c3;N=u z5WWMo)ydV>Vf=1UxNwKy+T=M7{Q6e6n+hL0JI|w4gy!f=MK&N!!c%dsa@`{ws_EBY z4Fv;2(-!BRng?eerd?@++w*6$hV}Ks?!@>L5l_VD0?sC$_kxMo(RzpG{ijI9DPg6P zx9hfNk=EiJVlT_2-gG%$wFb`>0UsBF0a!{j>@#8%Wj5_wjx*B5ibqa6I6OKWFU8GbZ8()Nlj2>E@cM*00GKLL_t(Y$L*A{Yui8= z#eb)^7%yFn2Mr1sYDzY>n>PCoP(4Lc@E?)gr4Z2A!G%JH47CV_8>`tknDCj5p$2aA?nKVXbTk^(y4`N6 zf1gYy^!xogzys!wO#M?BhR=GvUg;sWS}mH*=Hu~r{2cfw0N-`p&v6`AOU3t5O1-jx zgCGbh$7{F;7T|fFS6Rq#Jqy^&BCZ0%-LwAJ23x?BTCG-Dz;Lw%e2t>0vXJ3^vw(q= zva*oj4lE#6N?lcP6-5zBsVgAPUy(0qnpR2dB{0uYn**o+vIeI2GS8$LVmQp4-mlMQC)(}y z`%b;CPi$MC*tYJ}>lzpo^^0v{hP=Yr%}rtdZWFU8GbZ8()Nlj2>E@cM*00D=mog)JP+4(e~c`pq~GrYOn~dJMnm9kG#b%tHg~FjI-Sz# zbkbynxZVfP^Jur*J0GNB80flA7>4J-L<4Sx5Wkj_2iJ8GLIB)qz@_6jTgmJBob`OZ zbwAc#9s`DDS-GUw!GKi|08p}Rs=eL@C)OGokX~^%Nn!%93WD5ZiB{X!E7p?7mPOGt zDcN>9FWELl)7;=C+GF5NDRowcr8QVQTr17^POZ;f0u&8;Q?v38~b zPf-*hrTp``NGX%Pdny3$z)2W}=kIM*KcHRAKL-{8lTNVk&7LOW<&r0002ovPDHLkV1nY}-k$&f literal 0 HcmV?d00001 diff --git a/key_u.png b/key_u.png new file mode 100644 index 0000000000000000000000000000000000000000..2a00b00a1f8231b5fbc4072041d4bbb9c4826ed4 GIT binary patch literal 598 zcmV-c0;&CpP)WFU8GbZ8()Nlj2>E@cM*00Fv5L_t(Y$L*9cYui8= zhM&6zN|xfq1=DJDA(NF325<2XP=`Xb#lOI0=--Tn-4*l2Lr zXqfVdst6%&&!^M;xYf#!Tdn+jI?aU;w`Ki1CG}CB=Mvz}(b1oxu8n~4UoS4RiQ`xT z{JOXR;Kkk^0G4H~os*kvOn?a~_G~pO+LY1lcCV5odA-T#o=q7^lDv9oC92vOY}@{s zrs>OdMkkN4F{EkQ1Wq0r?E~MGQkC|aUctA(${3tYCX>pWR?nOnBgeMwFF_Dc2gh-U zqUfCj#;)s97d<-`z@1V`@DEs)l}X?x%d*-bdR9pO6B3B4E_)F@8%rPz!?1Rco(&~% z>id4}AU%63fgp;arRRB-Lp;wTilQYD6pu(ao6Vm0`~63SEEWp}gFy!LfYmcy{{eiT z&*$%(&E`(0)7fe=91b(!1Mqd-k8L0LWZU+E>$>!MJ##QoN)d)3zVDmQ`3S7G9wA@` kTmqTCE_Kb}i6`#!8=xJjpd@zo)c^nh07*qoM6N<$f@aSMi2wiq literal 0 HcmV?d00001 diff --git a/lamp_off.png b/lamp_off.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e0d9c81f8547e0977659af32aabf0afa45e3f3 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kwj^(N7lyeEk_?i|Ju@BxMK}vQ zB8wRqgbp(>2zM|hB>gZ33bL1Y`ns~;=aLXM=P56kv==BOn;8;O;+&tGo0?YwEjD>{C@Tr}s}CH9qT+y9=AWaRVoK0RTtjN8$_v+6!ciC3j7 UPLug!1oAtBr>mdKI;Vst0ITs_TmS$7 literal 0 HcmV?d00001 diff --git a/lamp_on.png b/lamp_on.png new file mode 100644 index 0000000000000000000000000000000000000000..ed58b8fee75c404705082b84fe958db219502fcb GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kwj^(N7lyeEk_?i|Ju@BxMK}vQ zB8wRqgbp(>2zM|hB>gZ33bL1Y`ns~;=aLXMGT+V9e+MWen;8;O;+&tGo0?Ywx)%k1fg6U%y*D(mqbkgoVRo8^qqPo8-{ z)Pt|6eVizrYs0+Z!a1d7G6xoKe8^KG)Ufq%{O{@0PP{8$H&JENed{w*mpwUWuDiaF Y(TBnG^z7M8zd%m(boFyt=akR{08_JKEC2ui literal 0 HcmV?d00001 diff --git a/main.c b/main.c new file mode 100644 index 0000000..2581740 --- /dev/null +++ b/main.c @@ -0,0 +1,863 @@ +#include "pdp6.h" +#include +#include +#include + +SDL_Surface *screen; + +SDL_Surface *keysurf[3]; +SDL_Surface *lampsurf[2]; +SDL_Surface *switchsurf[2]; + +typedef struct Key Key; +struct Key { + SDL_Surface **surfs; + SDL_Rect r; + int state; +}; + +typedef struct Light Light; +struct Light { + SDL_Surface **surfs; + SDL_Rect r; + int state; +}; + +typedef struct Switch Switch; +struct Switch { + SDL_Surface **surfs; + SDL_Rect r; + int state; + int active; /* mouse down */ +}; + +Key keys[] = { + { keysurf, { 646, 139, 18, 32 }, 0 }, + { keysurf, { 714, 139, 18, 32 }, 0 }, + { keysurf, { 782, 139, 18, 32 }, 0 }, + { keysurf, { 850, 139, 18, 32 }, 0 }, + { keysurf, { 918, 139, 18, 32 }, 0 }, + { keysurf, { 985, 139, 18, 32 }, 0 }, + { keysurf, { 1051, 139, 18, 32 }, 0 }, + { keysurf, { 1117, 139, 18, 32 }, 0 }, +}; + +Light op_lights[] = { + /* IR */ + { lampsurf, { 79, 43, 12, 12 }, 0 }, + { lampsurf, { 93, 43, 12, 12 }, 0 }, + { lampsurf, { 107, 43, 12, 12 }, 0 }, + { lampsurf, { 122, 43, 12, 12 }, 0 }, + { lampsurf, { 136, 43, 12, 12 }, 0 }, + { lampsurf, { 150, 43, 12, 12 }, 0 }, + { lampsurf, { 165, 43, 12, 12 }, 0 }, + { lampsurf, { 179, 43, 12, 12 }, 0 }, + { lampsurf, { 193, 43, 12, 12 }, 0 }, + { lampsurf, { 208, 43, 12, 12 }, 0 }, + { lampsurf, { 222, 43, 12, 12 }, 0 }, + { lampsurf, { 236, 43, 12, 12 }, 0 }, + { lampsurf, { 250, 43, 12, 12 }, 0 }, + { lampsurf, { 265, 43, 12, 12 }, 0 }, + { lampsurf, { 280, 43, 12, 12 }, 0 }, + { lampsurf, { 294, 43, 12, 12 }, 0 }, + { lampsurf, { 308, 43, 12, 12 }, 0 }, + { lampsurf, { 322, 43, 12, 12 }, 0 }, + /* MI */ + { lampsurf, { 79, 75, 12, 12 }, 0 }, + { lampsurf, { 93, 75, 12, 12 }, 0 }, + { lampsurf, { 107, 75, 12, 12 }, 0 }, + { lampsurf, { 122, 75, 12, 12 }, 0 }, + { lampsurf, { 136, 75, 12, 12 }, 0 }, + { lampsurf, { 150, 75, 12, 12 }, 0 }, + { lampsurf, { 165, 75, 12, 12 }, 0 }, + { lampsurf, { 179, 75, 12, 12 }, 0 }, + { lampsurf, { 193, 75, 12, 12 }, 0 }, + { lampsurf, { 208, 75, 12, 12 }, 0 }, + { lampsurf, { 222, 75, 12, 12 }, 0 }, + { lampsurf, { 236, 75, 12, 12 }, 0 }, + { lampsurf, { 251, 75, 12, 12 }, 0 }, + { lampsurf, { 265, 75, 12, 12 }, 0 }, + { lampsurf, { 279, 75, 12, 12 }, 0 }, + { lampsurf, { 294, 75, 12, 12 }, 0 }, + { lampsurf, { 308, 75, 12, 12 }, 0 }, + { lampsurf, { 322, 75, 12, 12 }, 0 }, + { lampsurf, { 337, 75, 12, 12 }, 0 }, + { lampsurf, { 351, 75, 12, 12 }, 0 }, + { lampsurf, { 365, 75, 12, 12 }, 0 }, + { lampsurf, { 380, 75, 12, 12 }, 0 }, + { lampsurf, { 394, 75, 12, 12 }, 0 }, + { lampsurf, { 408, 75, 12, 12 }, 0 }, + { lampsurf, { 423, 75, 12, 12 }, 0 }, + { lampsurf, { 437, 75, 12, 12 }, 0 }, + { lampsurf, { 451, 75, 12, 12 }, 0 }, + { lampsurf, { 466, 75, 12, 12 }, 0 }, + { lampsurf, { 480, 75, 12, 12 }, 0 }, + { lampsurf, { 494, 75, 12, 12 }, 0 }, + { lampsurf, { 509, 75, 12, 12 }, 0 }, + { lampsurf, { 523, 75, 12, 12 }, 0 }, + { lampsurf, { 537, 75, 12, 12 }, 0 }, + { lampsurf, { 552, 75, 12, 12 }, 0 }, + { lampsurf, { 566, 75, 12, 12 }, 0 }, + { lampsurf, { 580, 75, 12, 12 }, 0 }, + /* PC */ + { lampsurf, { 643, 43, 12, 12 }, 0 }, + { lampsurf, { 657, 43, 12, 12 }, 0 }, + { lampsurf, { 671, 43, 12, 12 }, 0 }, + { lampsurf, { 686, 43, 12, 12 }, 0 }, + { lampsurf, { 700, 43, 12, 12 }, 0 }, + { lampsurf, { 714, 43, 12, 12 }, 0 }, + { lampsurf, { 729, 43, 12, 12 }, 0 }, + { lampsurf, { 743, 43, 12, 12 }, 0 }, + { lampsurf, { 757, 43, 12, 12 }, 0 }, + { lampsurf, { 772, 43, 12, 12 }, 0 }, + { lampsurf, { 786, 43, 12, 12 }, 0 }, + { lampsurf, { 800, 43, 12, 12 }, 0 }, + { lampsurf, { 815, 43, 12, 12 }, 0 }, + { lampsurf, { 829, 43, 12, 12 }, 0 }, + { lampsurf, { 843, 43, 12, 12 }, 0 }, + { lampsurf, { 857, 43, 12, 12 }, 0 }, + { lampsurf, { 872, 43, 12, 12 }, 0 }, + { lampsurf, { 886, 43, 12, 12 }, 0 }, + /* MA */ + { lampsurf, { 643, 75, 12, 12 }, 0 }, + { lampsurf, { 657, 75, 12, 12 }, 0 }, + { lampsurf, { 671, 75, 12, 12 }, 0 }, + { lampsurf, { 686, 75, 12, 12 }, 0 }, + { lampsurf, { 700, 75, 12, 12 }, 0 }, + { lampsurf, { 714, 75, 12, 12 }, 0 }, + { lampsurf, { 729, 75, 12, 12 }, 0 }, + { lampsurf, { 743, 75, 12, 12 }, 0 }, + { lampsurf, { 757, 75, 12, 12 }, 0 }, + { lampsurf, { 772, 75, 12, 12 }, 0 }, + { lampsurf, { 786, 75, 12, 12 }, 0 }, + { lampsurf, { 800, 75, 12, 12 }, 0 }, + { lampsurf, { 815, 75, 12, 12 }, 0 }, + { lampsurf, { 829, 75, 12, 12 }, 0 }, + { lampsurf, { 843, 75, 12, 12 }, 0 }, + { lampsurf, { 857, 75, 12, 12 }, 0 }, + { lampsurf, { 872, 75, 12, 12 }, 0 }, + { lampsurf, { 886, 75, 12, 12 }, 0 }, + /* PIO */ + { lampsurf, { 974, 43, 12, 12 }, 0 }, + { lampsurf, { 988, 43, 12, 12 }, 0 }, + { lampsurf, { 1002, 43, 12, 12 }, 0 }, + { lampsurf, { 1016, 43, 12, 12 }, 0 }, + { lampsurf, { 1030, 43, 12, 12 }, 0 }, + { lampsurf, { 1044, 43, 12, 12 }, 0 }, + { lampsurf, { 1058, 43, 12, 12 }, 0 }, + /* PIR */ + { lampsurf, { 974, 75, 12, 12 }, 0 }, + { lampsurf, { 988, 75, 12, 12 }, 0 }, + { lampsurf, { 1002, 75, 12, 12 }, 0 }, + { lampsurf, { 1016, 75, 12, 12 }, 0 }, + { lampsurf, { 1030, 75, 12, 12 }, 0 }, + { lampsurf, { 1044, 75, 12, 12 }, 0 }, + { lampsurf, { 1058, 75, 12, 12 }, 0 }, + /* PIH */ + { lampsurf, { 974, 107, 12, 12 }, 0 }, + { lampsurf, { 988, 107, 12, 12 }, 0 }, + { lampsurf, { 1002, 107, 12, 12 }, 0 }, + { lampsurf, { 1016, 107, 12, 12 }, 0 }, + { lampsurf, { 1030, 107, 12, 12 }, 0 }, + { lampsurf, { 1044, 107, 12, 12 }, 0 }, + { lampsurf, { 1058, 107, 12, 12 }, 0 }, + /* Address stop, Repeat */ + { lampsurf, { 1126, 75, 12, 12 }, 0 }, + { lampsurf, { 1126, 107, 12, 12 }, 0 }, + /* Disable memory, Power */ + { lampsurf, { 1194, 75, 12, 12 }, 0 }, + { lampsurf, { 1194, 107, 12, 12 }, 0 }, + /* Run, Mem stop, PI on */ + { lampsurf, { 946, 43, 12, 12 }, 0 }, + { lampsurf, { 946, 75, 12, 12 }, 0 }, + { lampsurf, { 946, 107, 12, 12 }, 0 }, +}; + +Light ind_lights[] = { + /* MB */ + { lampsurf, { 713, 74, 12, 12 }, 0 }, + { lampsurf, { 727, 74, 12, 12 }, 0 }, + { lampsurf, { 741, 74, 12, 12 }, 0 }, + { lampsurf, { 756, 74, 12, 12 }, 0 }, + { lampsurf, { 770, 74, 12, 12 }, 0 }, + { lampsurf, { 784, 74, 12, 12 }, 0 }, + { lampsurf, { 799, 74, 12, 12 }, 0 }, + { lampsurf, { 813, 74, 12, 12 }, 0 }, + { lampsurf, { 827, 74, 12, 12 }, 0 }, + { lampsurf, { 842, 74, 12, 12 }, 0 }, + { lampsurf, { 856, 74, 12, 12 }, 0 }, + { lampsurf, { 870, 74, 12, 12 }, 0 }, + { lampsurf, { 885, 74, 12, 12 }, 0 }, + { lampsurf, { 899, 74, 12, 12 }, 0 }, + { lampsurf, { 913, 74, 12, 12 }, 0 }, + { lampsurf, { 928, 74, 12, 12 }, 0 }, + { lampsurf, { 942, 74, 12, 12 }, 0 }, + { lampsurf, { 956, 74, 12, 12 }, 0 }, + { lampsurf, { 971, 74, 12, 12 }, 0 }, + { lampsurf, { 985, 74, 12, 12 }, 0 }, + { lampsurf, { 999, 74, 12, 12 }, 0 }, + { lampsurf, { 1014, 74, 12, 12 }, 0 }, + { lampsurf, { 1028, 74, 12, 12 }, 0 }, + { lampsurf, { 1042, 74, 12, 12 }, 0 }, + { lampsurf, { 1057, 74, 12, 12 }, 0 }, + { lampsurf, { 1071, 74, 12, 12 }, 0 }, + { lampsurf, { 1085, 74, 12, 12 }, 0 }, + { lampsurf, { 1100, 74, 12, 12 }, 0 }, + { lampsurf, { 1114, 74, 12, 12 }, 0 }, + { lampsurf, { 1128, 74, 12, 12 }, 0 }, + { lampsurf, { 1143, 74, 12, 12 }, 0 }, + { lampsurf, { 1157, 74, 12, 12 }, 0 }, + { lampsurf, { 1171, 74, 12, 12 }, 0 }, + { lampsurf, { 1186, 74, 12, 12 }, 0 }, + { lampsurf, { 1200, 74, 12, 12 }, 0 }, + { lampsurf, { 1214, 74, 12, 12 }, 0 }, + /* AR */ + { lampsurf, { 713, 110, 12, 12 }, 0 }, + { lampsurf, { 727, 110, 12, 12 }, 0 }, + { lampsurf, { 741, 110, 12, 12 }, 0 }, + { lampsurf, { 756, 110, 12, 12 }, 0 }, + { lampsurf, { 770, 110, 12, 12 }, 0 }, + { lampsurf, { 784, 110, 12, 12 }, 0 }, + { lampsurf, { 799, 110, 12, 12 }, 0 }, + { lampsurf, { 813, 110, 12, 12 }, 0 }, + { lampsurf, { 827, 110, 12, 12 }, 0 }, + { lampsurf, { 842, 110, 12, 12 }, 0 }, + { lampsurf, { 856, 110, 12, 12 }, 0 }, + { lampsurf, { 870, 110, 12, 12 }, 0 }, + { lampsurf, { 885, 110, 12, 12 }, 0 }, + { lampsurf, { 899, 110, 12, 12 }, 0 }, + { lampsurf, { 913, 110, 12, 12 }, 0 }, + { lampsurf, { 928, 110, 12, 12 }, 0 }, + { lampsurf, { 942, 110, 12, 12 }, 0 }, + { lampsurf, { 956, 110, 12, 12 }, 0 }, + { lampsurf, { 971, 110, 12, 12 }, 0 }, + { lampsurf, { 985, 110, 12, 12 }, 0 }, + { lampsurf, { 999, 110, 12, 12 }, 0 }, + { lampsurf, { 1014, 110, 12, 12 }, 0 }, + { lampsurf, { 1028, 110, 12, 12 }, 0 }, + { lampsurf, { 1042, 110, 12, 12 }, 0 }, + { lampsurf, { 1057, 110, 12, 12 }, 0 }, + { lampsurf, { 1071, 110, 12, 12 }, 0 }, + { lampsurf, { 1085, 110, 12, 12 }, 0 }, + { lampsurf, { 1100, 110, 12, 12 }, 0 }, + { lampsurf, { 1114, 110, 12, 12 }, 0 }, + { lampsurf, { 1128, 110, 12, 12 }, 0 }, + { lampsurf, { 1143, 110, 12, 12 }, 0 }, + { lampsurf, { 1157, 110, 12, 12 }, 0 }, + { lampsurf, { 1171, 110, 12, 12 }, 0 }, + { lampsurf, { 1186, 110, 12, 12 }, 0 }, + { lampsurf, { 1200, 110, 12, 12 }, 0 }, + { lampsurf, { 1214, 110, 12, 12 }, 0 }, + /* MQ */ + { lampsurf, { 713, 146, 12, 12 }, 0 }, + { lampsurf, { 727, 146, 12, 12 }, 0 }, + { lampsurf, { 741, 146, 12, 12 }, 0 }, + { lampsurf, { 756, 146, 12, 12 }, 0 }, + { lampsurf, { 770, 146, 12, 12 }, 0 }, + { lampsurf, { 784, 146, 12, 12 }, 0 }, + { lampsurf, { 799, 146, 12, 12 }, 0 }, + { lampsurf, { 813, 146, 12, 12 }, 0 }, + { lampsurf, { 827, 146, 12, 12 }, 0 }, + { lampsurf, { 842, 146, 12, 12 }, 0 }, + { lampsurf, { 856, 146, 12, 12 }, 0 }, + { lampsurf, { 870, 146, 12, 12 }, 0 }, + { lampsurf, { 885, 146, 12, 12 }, 0 }, + { lampsurf, { 899, 146, 12, 12 }, 0 }, + { lampsurf, { 913, 146, 12, 12 }, 0 }, + { lampsurf, { 928, 146, 12, 12 }, 0 }, + { lampsurf, { 942, 146, 12, 12 }, 0 }, + { lampsurf, { 956, 146, 12, 12 }, 0 }, + { lampsurf, { 971, 146, 12, 12 }, 0 }, + { lampsurf, { 985, 146, 12, 12 }, 0 }, + { lampsurf, { 999, 146, 12, 12 }, 0 }, + { lampsurf, { 1014, 146, 12, 12 }, 0 }, + { lampsurf, { 1028, 146, 12, 12 }, 0 }, + { lampsurf, { 1042, 146, 12, 12 }, 0 }, + { lampsurf, { 1057, 146, 12, 12 }, 0 }, + { lampsurf, { 1071, 146, 12, 12 }, 0 }, + { lampsurf, { 1085, 146, 12, 12 }, 0 }, + { lampsurf, { 1100, 146, 12, 12 }, 0 }, + { lampsurf, { 1114, 146, 12, 12 }, 0 }, + { lampsurf, { 1128, 146, 12, 12 }, 0 }, + { lampsurf, { 1143, 146, 12, 12 }, 0 }, + { lampsurf, { 1157, 146, 12, 12 }, 0 }, + { lampsurf, { 1171, 146, 12, 12 }, 0 }, + { lampsurf, { 1186, 146, 12, 12 }, 0 }, + { lampsurf, { 1200, 146, 12, 12 }, 0 }, + { lampsurf, { 1214, 146, 12, 12 }, 0 }, + /* flags */ + /* FE */ + { lampsurf, { 539, 161, 14, 22 }, 0 }, + { lampsurf, { 451, 42, 14, 22 }, 0 }, + { lampsurf, { 451, 59, 14, 22 }, 0 }, + { lampsurf, { 451, 76, 14, 22 }, 0 }, + { lampsurf, { 451, 93, 14, 22 }, 0 }, + { lampsurf, { 451, 110, 14, 22 }, 0 }, + { lampsurf, { 451, 127, 14, 22 }, 0 }, + { lampsurf, { 451, 144, 14, 22 }, 0 }, + { lampsurf, { 451, 161, 14, 22 }, 0 }, + /* SC */ + { lampsurf, { 539, 144, 14, 22 }, 0 }, + { lampsurf, { 495, 42, 14, 22 }, 0 }, + { lampsurf, { 495, 59, 14, 22 }, 0 }, + { lampsurf, { 495, 76, 14, 22 }, 0 }, + { lampsurf, { 495, 93, 14, 22 }, 0 }, + { lampsurf, { 495, 110, 14, 22 }, 0 }, + { lampsurf, { 495, 127, 14, 22 }, 0 }, + { lampsurf, { 495, 144, 14, 22 }, 0 }, + { lampsurf, { 495, 161, 14, 22 }, 0 }, + /* misc flip-flops */ + /* column 1 */ + { lampsurf, { 55, 42, 14, 22 }, 0 }, + { lampsurf, { 55, 59, 14, 22 }, 0 }, + { lampsurf, { 55, 76, 14, 22 }, 0 }, + { lampsurf, { 55, 93, 14, 22 }, 0 }, + { lampsurf, { 55, 110, 14, 22 }, 0 }, + { lampsurf, { 55, 127, 14, 22 }, 0 }, + { lampsurf, { 55, 144, 14, 22 }, 0 }, + { lampsurf, { 55, 161, 14, 22 }, 0 }, + /* */ + { lampsurf, { 319, 110, 14, 22 }, 0 }, + { lampsurf, { 319, 127, 14, 22 }, 0 }, + /* column 12 */ + { lampsurf, { 539, 42, 14, 22 }, 0 }, + { lampsurf, { 539, 59, 14, 22 }, 0 }, + { lampsurf, { 539, 76, 14, 22 }, 0 }, + { lampsurf, { 539, 93, 14, 22 }, 0 }, + { lampsurf, { 539, 110, 14, 22 }, 0 }, + { lampsurf, { 539, 127, 14, 22 }, 0 }, + /* column 13 */ + { lampsurf, { 583, 42, 14, 22 }, 0 }, + { lampsurf, { 583, 59, 14, 22 }, 0 }, + { lampsurf, { 583, 76, 14, 22 }, 0 }, + { lampsurf, { 583, 93, 14, 22 }, 0 }, + { lampsurf, { 583, 110, 14, 22 }, 0 }, + { lampsurf, { 583, 127, 14, 22 }, 0 }, + { lampsurf, { 583, 144, 14, 22 }, 0 }, + { lampsurf, { 583, 161, 14, 22 }, 0 }, + /* column 14 */ + { lampsurf, { 627, 42, 14, 22 }, 0 }, + { lampsurf, { 627, 59, 14, 22 }, 0 }, + { lampsurf, { 627, 76, 14, 22 }, 0 }, + { lampsurf, { 627, 93, 14, 22 }, 0 }, + { lampsurf, { 627, 110, 14, 22 }, 0 }, + { lampsurf, { 627, 127, 14, 22 }, 0 }, + { lampsurf, { 627, 144, 14, 22 }, 0 }, + { lampsurf, { 627, 161, 14, 22 }, 0 }, + /* column 9 */ + { lampsurf, { 407, 42, 14, 22 }, 0 }, + { lampsurf, { 407, 59, 14, 22 }, 0 }, + { lampsurf, { 407, 76, 14, 22 }, 0 }, + { lampsurf, { 407, 93, 14, 22 }, 0 }, + { lampsurf, { 407, 110, 14, 22 }, 0 }, + { lampsurf, { 407, 127, 14, 22 }, 0 }, + { lampsurf, { 407, 144, 14, 22 }, 0 }, + { lampsurf, { 407, 161, 14, 22 }, 0 }, +}; +Light extra_lights[] = { + /* MEMBUS */ + { lampsurf, { 693, 26, 12, 12 }, 0 }, + { lampsurf, { 707, 26, 12, 12 }, 0 }, + { lampsurf, { 721, 26, 12, 12 }, 0 }, + { lampsurf, { 736, 26, 12, 12 }, 0 }, + { lampsurf, { 750, 26, 12, 12 }, 0 }, + { lampsurf, { 764, 26, 12, 12 }, 0 }, + { lampsurf, { 779, 26, 12, 12 }, 0 }, + { lampsurf, { 793, 26, 12, 12 }, 0 }, + { lampsurf, { 807, 26, 12, 12 }, 0 }, + { lampsurf, { 822, 26, 12, 12 }, 0 }, + { lampsurf, { 836, 26, 12, 12 }, 0 }, + { lampsurf, { 850, 26, 12, 12 }, 0 }, + { lampsurf, { 865, 26, 12, 12 }, 0 }, + { lampsurf, { 879, 26, 12, 12 }, 0 }, + { lampsurf, { 893, 26, 12, 12 }, 0 }, + { lampsurf, { 908, 26, 12, 12 }, 0 }, + { lampsurf, { 922, 26, 12, 12 }, 0 }, + { lampsurf, { 936, 26, 12, 12 }, 0 }, + { lampsurf, { 951, 26, 12, 12 }, 0 }, + { lampsurf, { 965, 26, 12, 12 }, 0 }, + { lampsurf, { 979, 26, 12, 12 }, 0 }, + { lampsurf, { 994, 26, 12, 12 }, 0 }, + { lampsurf, { 1008, 26, 12, 12 }, 0 }, + { lampsurf, { 1022, 26, 12, 12 }, 0 }, + { lampsurf, { 1037, 26, 12, 12 }, 0 }, + { lampsurf, { 1051, 26, 12, 12 }, 0 }, + { lampsurf, { 1065, 26, 12, 12 }, 0 }, + { lampsurf, { 1080, 26, 12, 12 }, 0 }, + { lampsurf, { 1094, 26, 12, 12 }, 0 }, + { lampsurf, { 1108, 26, 12, 12 }, 0 }, + { lampsurf, { 1123, 26, 12, 12 }, 0 }, + { lampsurf, { 1137, 26, 12, 12 }, 0 }, + { lampsurf, { 1151, 26, 12, 12 }, 0 }, + { lampsurf, { 1166, 26, 12, 12 }, 0 }, + { lampsurf, { 1180, 26, 12, 12 }, 0 }, + { lampsurf, { 1194, 26, 12, 12 }, 0 }, + /* PR */ + { lampsurf, { 74, 26, 12, 12 }, 0 }, + { lampsurf, { 88, 26, 12, 12 }, 0 }, + { lampsurf, { 102, 26, 12, 12 }, 0 }, + { lampsurf, { 117, 26, 12, 12 }, 0 }, + { lampsurf, { 131, 26, 12, 12 }, 0 }, + { lampsurf, { 145, 26, 12, 12 }, 0 }, + { lampsurf, { 160, 26, 12, 12 }, 0 }, + { lampsurf, { 174, 26, 12, 12 }, 0 }, + /* RLR */ + { lampsurf, { 274, 26, 12, 12 }, 0 }, + { lampsurf, { 288, 26, 12, 12 }, 0 }, + { lampsurf, { 302, 26, 12, 12 }, 0 }, + { lampsurf, { 317, 26, 12, 12 }, 0 }, + { lampsurf, { 331, 26, 12, 12 }, 0 }, + { lampsurf, { 345, 26, 12, 12 }, 0 }, + { lampsurf, { 360, 26, 12, 12 }, 0 }, + { lampsurf, { 374, 26, 12, 12 }, 0 }, + /* RLA */ + { lampsurf, { 475, 26, 12, 12 }, 0 }, + { lampsurf, { 489, 26, 12, 12 }, 0 }, + { lampsurf, { 503, 26, 12, 12 }, 0 }, + { lampsurf, { 518, 26, 12, 12 }, 0 }, + { lampsurf, { 532, 26, 12, 12 }, 0 }, + { lampsurf, { 546, 26, 12, 12 }, 0 }, + { lampsurf, { 561, 26, 12, 12 }, 0 }, + { lampsurf, { 575, 26, 12, 12 }, 0 }, +}; +Light *ir_lght, *mi_lght, *pc_lght, *ma_lght, *pio_lght, *pir_lght, + *pih_lght, *rest_lght; +Light *mb_lght, *pc_lght, *ar_lght, *mq_lght, *fe_lght, *sc_lght, + *ff_lght; +Light *membus_lght, *pr_lght, *rlr_lght, *rla_lght; + +Switch switches[] = { + /* DATA */ + { switchsurf, { 78, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 92, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 106, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 121, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 135, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 149, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 164, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 178, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 192, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 207, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 221, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 235, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 250, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 264, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 278, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 293, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 307, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 321, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 336, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 350, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 364, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 379, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 393, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 407, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 422, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 436, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 450, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 465, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 479, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 493, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 508, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 522, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 536, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 551, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 565, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 579, 102, 14, 22 }, 0, 0 }, + /* MAS */ + { switchsurf, { 642, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 656, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 670, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 685, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 699, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 713, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 728, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 742, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 756, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 771, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 785, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 799, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 814, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 828, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 842, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 857, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 871, 102, 14, 22 }, 0, 0 }, + { switchsurf, { 885, 102, 14, 22 }, 0, 0 }, + /* Address stop, Repeat */ + { switchsurf, { 1111, 70, 14, 22 }, 0, 0 }, + { switchsurf, { 1111, 102, 14, 22 }, 0, 0 }, + /* Disable memory, Power */ + { switchsurf, { 1179, 70, 14, 22 }, 0, 0 }, + { switchsurf, { 1179, 102, 14, 22 }, 0, 0 }, + + /* RIM MAINT */ + { switchsurf, { 633, 21, 14, 22 }, 0, 0 }, +}; +Switch *data_sw, *ma_sw, *rest_sw, *rim_maint_sw; + +void +setlights(word w, Light *l, int n) +{ + int i; + for(i = 0; i < n; i++) + l[n-i-1].state = !!(w & 1L<x || x > r->x+r->w || + y < r->y || y > r->y+r->h){ + switches[i].active = 0; + continue; + } + if(!switches[i].active){ + prevst = switches[i].state; + if(buttonstate & 1) + switches[i].state = !switches[i].state; + if(buttonstate & 2) + switches[i].state = 1; + if(buttonstate & 4) + switches[i].state = 0; + switches[i].active = 1; + + /* state changed */ + if(prevst != switches[i].state){ + /* power */ + if(&switches[i] == &rest_sw[3]){ + if(prevst == 0) + poweron(); + } + /* rim maint */ + if(&switches[i] == rim_maint_sw){ + if(prevst == 0) + apr.key_rim_sbr = 1; + } + } + } + } + + for(i = 0; i < nelem(keys); i++){ + r = &keys[i].r; + if(buttonstate == 0 || + x < r->x || x > r->x+r->w || + y < r->y || y > r->y+r->h){ + keys[i].state = 0; + continue; + } + prevst = keys[i].state; + if(buttonstate & 1) + keys[i].state = 1; + if(buttonstate & 4) + keys[i].state = 2; + if(prevst != keys[i].state){ + switch(i){ + case 0: /* start */ + case 1: /* cont */ + case 3: /* execute, reset */ + case 4: /* deposit */ + case 5: /* examine */ + if(keys[i].state && apr.sw_power) + extpulse |= 1; + break; + case 2: /* stop */ + case 6: /* on off reader */ + case 7: /* punch */ + break; + } + } + } +} + +int +main() +{ + SDL_Event ev; + SDL_MouseButtonEvent *mbev; + SDL_MouseMotionEvent *mmev; + SDL_Surface *op_surf, *ind_surf, *extra_surf; + SDL_Rect op_panel = { 0, 274, 1280, 210 }; + SDL_Rect ind_panel = { 0, 64, 1280, 210 }; + SDL_Rect extra_panel = { 0, 0, 1280, 210 }; + int i; + Light *l; + Switch *sw; + + if(SDL_Init(SDL_INIT_VIDEO) < 0){ +error: + fprintf(stderr, "error: %s\n", SDL_GetError()); + return 1; + } + screen = SDL_SetVideoMode(1280, 484, 32, SDL_DOUBLEBUF); + if(screen == NULL) + goto error; + + if((IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG) != IMG_INIT_PNG){ + fprintf(stderr, "error: init SDL_Image: %s\n", IMG_GetError()); + return 1; + } + + op_surf = IMG_Load("op_panel.png"); + if(op_surf == NULL){ + fprintf(stderr, "Couldn't load op_panel.png\n"); + return 1; + } + ind_surf = IMG_Load("ind_panel.png"); + if(ind_surf == NULL){ + fprintf(stderr, "Couldn't load ind_panel.png\n"); + return 1; + } + extra_surf = IMG_Load("extra_panel.png"); + if(extra_surf == NULL){ + fprintf(stderr, "Couldn't load extra_panel.png\n"); + return 1; + } + + keysurf[0] = IMG_Load("key_n.png"); + if(keysurf[0] == NULL){ + fprintf(stderr, "Couldn't load key_n.png\n"); + return 1; + } + keysurf[1] = IMG_Load("key_d.png"); + if(keysurf[1] == NULL){ + fprintf(stderr, "Couldn't load key_d.png\n"); + return 1; + } + keysurf[2] = IMG_Load("key_u.png"); + if(keysurf[2] == NULL){ + fprintf(stderr, "Couldn't load key_u.png\n"); + return 1; + } + + lampsurf[0] = IMG_Load("lamp_off.png"); + if(lampsurf[0] == NULL){ + fprintf(stderr, "Couldn't load lamp_off.png\n"); + return 1; + } + lampsurf[1] = IMG_Load("lamp_on.png"); + if(lampsurf[1] == NULL){ + fprintf(stderr, "Couldn't load lamp_on.png\n"); + return 1; + } + + switchsurf[0] = IMG_Load("switch_d.png"); + if(switchsurf[0] == NULL){ + fprintf(stderr, "Couldn't load switch_d.png\n"); + return 1; + } + switchsurf[1] = IMG_Load("switch_u.png"); + if(switchsurf[1] == NULL){ + fprintf(stderr, "Couldn't load switch_u.png\n"); + return 1; + } + + l = op_lights; + ir_lght = l; l += 18; + mi_lght = l; l += 36; + pc_lght = l; l += 18; + ma_lght = l; l += 18; + pio_lght = l; l += 7; + pir_lght = l; l += 7; + pih_lght = l; l += 7; + rest_lght = l; + sw = switches; + data_sw = sw; sw += 36; + ma_sw = sw; sw += 18; + rest_sw = sw; sw += 4; + rim_maint_sw = sw; + l = ind_lights; + mb_lght = l; l += 36; + ar_lght = l; l += 36; + mq_lght = l; l += 36; + fe_lght = l; l += 9; + sc_lght = l; l += 9; + ff_lght = l; + l = extra_lights; + membus_lght = l; l += 36; + pr_lght = l; l += 8; + rlr_lght = l; l += 8; + rla_lght = l; + for(i = 0; i < nelem(keys); i++){ + keys[i].r.x += op_panel.x; + keys[i].r.y += op_panel.y; + } + for(i = 0; i < nelem(op_lights); i++){ + op_lights[i].r.x += op_panel.x; + op_lights[i].r.y += op_panel.y; + } + for(i = 0; i < nelem(ind_lights); i++){ + ind_lights[i].r.x += ind_panel.x; + ind_lights[i].r.y += ind_panel.y; + } + for(i = 0; i < nelem(extra_lights); i++){ + extra_lights[i].r.x += extra_panel.x; + extra_lights[i].r.y += extra_panel.y; + } + for(i = 0; i < nelem(switches)-1; i++){ + switches[i].r.x += op_panel.x; + switches[i].r.y += op_panel.y; + } + rim_maint_sw->r.x += extra_panel.x; + rim_maint_sw->r.y += extra_panel.y; + + initmem(); + memset(&apr, 0xff, sizeof apr); + + for(;;){ + while(SDL_PollEvent(&ev)) + switch(ev.type){ + case SDL_MOUSEMOTION: + mmev = (SDL_MouseMotionEvent*)&ev; + mouse(0, mmev->state, + mmev->x, mmev->y); + break; + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + mbev = (SDL_MouseButtonEvent*)&ev; + mouse(mbev->button, mbev->state, + mbev->x, mbev->y); + break; + case SDL_QUIT: + SDL_Quit(); + return 0; + } + setlights(apr.ir, ir_lght, 18); + setlights(apr.mi, mi_lght, 36); + setlights(apr.pc, pc_lght, 18); + setlights(apr.ma, ma_lght, 18); + setlights(apr.pio, pio_lght, 7); + setlights(apr.pir, pir_lght, 7); + setlights(apr.pih, pih_lght, 7); + rest_lght[4].state = apr.run; + rest_lght[5].state = apr.mc_stop; + rest_lght[6].state = apr.pi_active; + rest_lght[0].state = apr.sw_addr_stop = rest_sw[0].state; + rest_lght[1].state = apr.sw_repeat = rest_sw[1].state; + rest_lght[2].state = apr.sw_mem_disable = rest_sw[2].state; + rest_lght[3].state = apr.sw_power = rest_sw[3].state; + apr.sw_rim_maint = rim_maint_sw->state; + apr.data = getswitches(data_sw, 36); + apr.mas = getswitches(ma_sw, 18); + apr.key_start = keys[0].state == 1; + apr.key_readin = keys[0].state == 2; + apr.key_inst_cont = keys[1].state == 1; + apr.key_mem_cont = keys[1].state == 2; + apr.key_inst_stop = keys[2].state == 1; + apr.key_mem_stop = keys[2].state == 2; + apr.key_io_reset = keys[3].state == 1; + apr.key_execute = keys[3].state == 2; + apr.key_dep = keys[4].state == 1; + apr.key_dep_next = keys[4].state == 2; + apr.key_ex = keys[5].state == 1; + apr.key_ex_next = keys[5].state == 2; + apr.key_rd_off = keys[6].state == 1; + apr.key_rd_on = keys[6].state == 2; + apr.key_pt_rd = keys[7].state == 1; + apr.key_pt_wr = keys[7].state == 2; + + setlights(apr.mb, mb_lght, 36); + setlights(apr.ar, ar_lght, 36); + setlights(apr.mq, mq_lght, 36); + setlights(apr.fe, fe_lght, 9); + setlights(apr.sc, sc_lght, 9); + ff_lght[0].state = apr.key_ex_st; + ff_lght[1].state = apr.key_ex_sync; + ff_lght[2].state = apr.key_dep_st; + ff_lght[3].state = apr.key_dep_sync; + ff_lght[4].state = apr.key_rd_wr; + ff_lght[5].state = apr.mc_rd; + ff_lght[6].state = apr.mc_wr; + ff_lght[7].state = apr.mc_rq; + ff_lght[8].state = apr.mc_split_cyc_sync; + ff_lght[9].state = apr.mc_stop_sync; + ff_lght[10].state = !apr.ex_user; + ff_lght[11].state = apr.cpa_illeg_op; + ff_lght[12].state = apr.ex_ill_op; + ff_lght[13].state = apr.ex_uuo_sync; + ff_lght[14].state = apr.ex_pi_sync; + ff_lght[15].state = apr.mq36; + ff_lght[16].state = apr.key_rim_sbr; + ff_lght[17].state = apr.cry0_cry1; + ff_lght[18].state = apr.ar_cry0; + ff_lght[19].state = apr.ar_cry1; + ff_lght[20].state = apr.ar_ov_flag; + ff_lght[21].state = apr.ar_cry0_flag; + ff_lght[22].state = apr.ar_cry1_flag; + ff_lght[23].state = apr.pc_chg_flag; + ff_lght[24].state = apr.cpa_non_exist_mem; + ff_lght[25].state = apr.cpa_clock_en; + ff_lght[26].state = apr.cpa_clock_flag; + ff_lght[27].state = apr.cpa_pc_chg_en; + ff_lght[28].state = apr.cpa_arov_en; + ff_lght[29].state = apr.cpa_pia33; + ff_lght[30].state = apr.cpa_pia34; + ff_lght[31].state = apr.cpa_pia35; + ff_lght[32].state = apr.pi_ov; + ff_lght[33].state = apr.pi_cyc; + ff_lght[34].state = apr.pi_req; + ff_lght[35].state = apr.iot_go; + ff_lght[36].state = apr.a_long; + ff_lght[37].state = apr.ma == apr.mas; + ff_lght[38].state = apr.uuo_f1; + ff_lght[39].state = apr.cpa_pdl_ov; + + setlights(membus0, membus_lght, 36); + setlights(apr.pr, pr_lght, 8); + setlights(apr.rlr, rlr_lght, 8); + setlights(apr.rla, rla_lght, 8); + + SDL_BlitSurface(op_surf, NULL, screen, &op_panel); + SDL_BlitSurface(ind_surf, NULL, screen, &ind_panel); + SDL_BlitSurface(extra_surf, NULL, screen, &extra_panel); + for(i = 0; i < nelem(keys); i++) + SDL_BlitSurface(keys[i].surfs[keys[i].state], + NULL, screen, &keys[i].r); + for(i = 0; i < nelem(op_lights); i++) + SDL_BlitSurface(op_lights[i].surfs[op_lights[i].state && apr.sw_power], + NULL, screen, &op_lights[i].r); + for(i = 0; i < nelem(ind_lights); i++) + SDL_BlitSurface(ind_lights[i].surfs[ind_lights[i].state && apr.sw_power], + NULL, screen, &ind_lights[i].r); + for(i = 0; i < nelem(extra_lights); i++) + SDL_BlitSurface(extra_lights[i].surfs[extra_lights[i].state && apr.sw_power], + NULL, screen, &extra_lights[i].r); + for(i = 0; i < nelem(switches); i++) + SDL_BlitSurface(switches[i].surfs[switches[i].state], + NULL, screen, &switches[i].r); + SDL_Flip(screen); + } +} diff --git a/mem b/mem new file mode 100644 index 0000000..1c50af2 --- /dev/null +++ b/mem @@ -0,0 +1,23 @@ +1234 +4321 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +11111 +22222 +33333 +44444 +55555 +66666 +77777 diff --git a/mem.c b/mem.c new file mode 100644 index 0000000..e963b93 --- /dev/null +++ b/mem.c @@ -0,0 +1,50 @@ +#include "pdp6.h" + +word memory[256*1024]; +//hword maxmem = 256*1024; +hword maxmem = 64*1024; +word fmem[16]; +word membus0, membus1; +word *hold; + +void +initmem(void) +{ + FILE *f; + word w; + hword a; + if(f = fopen("mem", "r"), f == NULL) + return; + for(a = 0; a < maxmem && fscanf(f, "%lo", &w) != EOF; a++) + memory[a] = w; + fclose(f); +} + +void +wakemem(void) +{ + hword a; + if(membus0 & MEMBUS_RQ_CYC){ + a = membus0>>4 & 037777; + if(membus0 & MEMBUS_MA21_1) a |= 0040000; + if(membus0 & MEMBUS_MA20_1) a |= 0100000; + if(membus0 & MEMBUS_MA19_1) a |= 0200000; + if(membus0 & MEMBUS_MA18_1) a |= 0400000; + if(a >= maxmem || + membus0 & MEMBUS_MA_FMC_SEL1 && a >= 16) + return; + + membus0 |= MEMBUS_MAI_ADDR_ACK; + hold = membus0 & MEMBUS_MA_FMC_SEL1 ? &fmem[a] : &memory[a]; + if(membus0 & MEMBUS_RD_RQ){ + membus1 = *hold; + membus0 |= MEMBUS_MAI_RD_RS; + hold = NULL; + } + } + if(membus0 & MEMBUS_MAI_WR_RS && hold){ + *hold = membus1; + membus0 &= ~MEMBUS_MAI_WR_RS; + hold = NULL; + } +} diff --git a/op_panel.png b/op_panel.png new file mode 100644 index 0000000000000000000000000000000000000000..95b8f671feb4e290b9ff03fc6b499b5b95209e9f GIT binary patch literal 20946 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 +#include +#include + +#define nelem(a) (sizeof(a)/sizeof(a[0])) + +typedef uint64_t word; +typedef uint32_t hword; +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; +typedef char bool; + +typedef struct Apr Apr; +struct Apr { + hword ir; + word mi; + word data; + hword pc; + hword ma; + hword mas; + word mb; + word ar; + word mq; + u8 pio, pir, pih; + u16 sc, fe; + u8 pr, rlr, rla; + bool run, pi_active; + bool sw_addr_stop, sw_repeat, sw_mem_disable, sw_power; + bool sw_rim_maint; + /* keys */ + bool key_start, key_readin; + bool key_mem_cont, key_inst_cont; + bool key_mem_stop, key_inst_stop; + bool key_io_reset, key_execute; + bool key_dep, key_dep_next; + bool key_ex, key_ex_next; + bool key_rd_off, key_rd_on; + bool key_pt_rd, key_pt_wr; + + /* flip-flops */ + bool ex_mode_sync, ex_uuo_sync, ex_pi_sync, ex_ill_op, ex_user; + bool pc_chg_flag, ar_ov_flag, ar_cry0_flag, ar_cry1_flag; + bool pi_ov, pi_cyc, pi_req; + + bool key_ex_st, key_ex_sync; + bool key_dep_st, key_dep_sync; + bool key_rd_wr, key_rim_sbr; + + bool mc_rd, mc_wr, mc_rq, mc_stop, mc_stop_sync, mc_split_cyc_sync; + + bool cpa_iot_user, cpa_illeg_op, cpa_non_exist_mem, + cpa_clock_en, cpa_clock_flag, cpa_pc_chg_en, cpa_pdl_ov, + cpa_arov_en, cpa_pia33, cpa_pia34, cpa_pia35; + + bool cry0_cry1, ar_cry0, ar_cry1; + /* ?? */ + bool mq36; + bool iot_go, a_long, uuo_f1; + + /* sbr flip-flops */ + bool chf7; + + /* temporaries */ + bool ex_inh_rel; +}; +extern Apr apr; +void *aprmain(void *p); +extern int extpulse; + +void initmem(void); +void wakemem(void); +// 7-2, 7-10 +enum { + MEMBUS_MA21 = 0000000000001, + MEMBUS_WR_RQ = 0000000000004, + MEMBUS_RD_RQ = 0000000000010, + MEMBUS_MA_FMC_SEL0 = 0000001000000, + MEMBUS_MA_FMC_SEL1 = 0000002000000, + MEMBUS_MA35_0 = 0000004000000, + MEMBUS_MA35_1 = 0000010000000, + MEMBUS_MA21_0 = 0000020000000, + MEMBUS_MA21_1 = 0000040000000, + MEMBUS_MA20_0 = 0000100000000, + MEMBUS_MA20_1 = 0000200000000, + MEMBUS_MA19_0 = 0000400000000, + MEMBUS_MA19_1 = 0001000000000, + MEMBUS_MA18_0 = 0002000000000, + MEMBUS_MA18_1 = 0004000000000, + MEMBUS_RQ_CYC = 0020000000000, + MEMBUS_MAI_WR_RS = 0100000000000, + MEMBUS_MAI_RD_RS = 0200000000000, + MEMBUS_MAI_ADDR_ACK = 0400000000000, +}; +extern word membus0, membus1; diff --git a/switch_d.png b/switch_d.png new file mode 100644 index 0000000000000000000000000000000000000000..4f83e4f70d26567b5c65178848d91480b43ce945 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^d_XM5!3HEhoL#F9q}YwGDtE=F89oM2o&Kg z@Q5sCU=TXYz#!bgn2_|t7%0eI;_2(kexFN1MAYEdqkZ#%Lb9155hc#~xw)x%B|t6% zgL6@8Vo7R>LV0FMhJw4NZ$OG(Dmzg8xTlL_h{frrlTP!t81T5r3%YOXy3pw=ZsHJM zBDhm{1=G2caXd{Q1fvRXPgGLeCMLtEa1<%Q~loCIB#?hl2nB literal 0 HcmV?d00001 diff --git a/switch_u.png b/switch_u.png new file mode 100644 index 0000000000000000000000000000000000000000..ca6007752a76fd77b4fd4b72fde329e3cdf77dcd GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^d_XM5!3HEhoL#F9q}YwGDtE=F89oM2o&Kg z@Q5sCU=TXYz#!bgn2_|t7%0eI;_2(kexFN1MAS;kJiHMoB%2u$QR1ARo12;HT6t1<-;u;af;&tr%+H&) zh9?AFT^ClFQ^d!xT*+wjj@#2X_N|!_w2NtP1^371k4gqy1%X#hU%jqBWcKV%H^bbH zH7!N^bOuMIP5R^IDA`Ja)0!sKAFvhVXj!N%a}>gTe~DWM4fYZ!>@ literal 0 HcmV?d00001