青春时代是一个短暂的美梦,当你醒来时,它早已消失得无影无踪了。
 
今日:0    总帖:81
admin
5243
原文地址:http://weibo.com/ttarticle/p/show?id=2309351002704146441940550858&u=1668632407&m=4146441712461037&cu=1668632407写在前面前两天和几位技术大牛聊天,大家突然发现那些身边的优秀的技术人中,有很多人都拥有相同的路径和很多共同点。简单的说,技术大牛虽然凤毛麟角,但其实成为技术大牛也没有那么困难,就是“有技巧无捷径”。“有技巧”是说,任何一个领域的专家,只要精通该领域的已有知识就可以,只要你的学习能力够强、能够掌握一些经验技巧就一定能够办得到,不像很多岗位对于“创新”的要求,需要用已有的知识创造出未知的产品。“无捷径”是说水到渠成,你把该做的事情一件一件琢磨好,在每一件事情上多下点功夫,自然而然就会有“渠”。除了技术类岗位,很多岗位的要求也都一样,胜任力或者发展轨迹很清晰,看似不难,难得是有人可以沉得下心来细细打磨。就来说说技术大牛们通常不同阶段的注意力都在哪,也可以说是需要你沉下心来好好打磨的四个层次——第一个层次,专业领域内的技术精通。要作为一名技术领域的强人,必须要确保在某个技术方向上非常精通,技术的根基要扎得非常深,稳扎稳打,这是你的技术招牌。前两天朋友圈有人问:“面试时候是否会问设计模式相关的问题。”很多大牛表示很少问道,因为越是优秀的技术人员,注意力越是在一线技术上,越是关注在表面花哨的东西,越写不出牛逼的代码。所以第一个层次,需要沉得下心,深钻技术,细细打磨。第二个层次,有一定的技术广度。技术的深度和广度本来就是一个相辅相成的协同,有时候其实没有办法分出个先后。你会发现,很多技术大牛非常非常的博学,他们似乎都精力无限、兴趣广泛?没错,广度这个事情指的就是信息量,而信息量的获取往往跟精力和兴趣相关。 很多人会询问技术的深度和广度那个更重要,我觉得“吃透一样才是立身之本”,所以广度应该有,但是更多的时候“广度”要辅助“深度”。即时很多事情你并没有做过,但一定要清楚个二三,需要的时候可以立即钻进去。所以第二个层次,需要的是走出去的心境。第三个层次,潜入到行业中了解业务和流程。做得越多,你越会发现没有技术独立存在的场景,技术的存在是为了更好的服务于应用场景,不潜入到一个行业当中,不知晓行业的应用环境、组织流程、商业价值,就难以做出和业务无痕交融的产品。技术是把商业需求转换成产品的一个关键角色,因此第三个层次,需要的是了解技术以外的东西。第四个层次,了解社会心理学。做得更多,你会发现,你会从对技术的研究,变为对行业的研究,再变为对人性的研究。产品最终是为了满足人的需要才有价值,而产品研发本身也需要多人协作。社会心理学主要是研究人际关系。当然了,我觉得这个还是非常难的,一般做到二三层次就已经可以是技术大牛了。对CEO的要求可以这么苛刻。
6 0 2643天前
admin
6678
比尔·盖茨31岁,就成为世界首富。很多人好奇,作为世界第一大PC系统的创始人,抛弃世界首富的头衔,单单从程序员角度来讨论,比尔盖茨的代码水平如何?其实,比尔·盖茨对写代码有一种狂热的喜好。上高中的时候,为了获得源代码,比尔·盖茨曾经去翻垃圾桶。据了解,在1978年的Microsoft BASIC源代码6502中,比尔·盖茨实现了FOR和GOSUB的所有BASIC语句,函数,运算符,表达式评估,堆栈管理,内存管理器,数组和字符串库。昨日,编程网站w3cschool报道,在未经微软或比尔盖茨同意的情况下,某人公开了1978年的Microsoft BASIC for 6502源代码,以及原始评论、文档和彩蛋,这是目前公开的比尔·盖茨写的最古老程序。除了比尔盖茨外,很多互联网大佬都是程序员出身,比如马化腾、比如雷军等人。TITLE BASIC M6502 8K VER 1.1 BY MICRO-SOFT SEARCH M6502 SALL RADIX 10 ;THROUGHOUT ALL BUT MATH-PAK. $Z:: ;STARTING POINT FOR M6502 SIMULATOR ORG 0 ;START OFF AT LOCATION ZERO. SUBTTL SWITCHES,MACROS. REALIO=4 ;5=STM ;4=APPLE. ;3=COMMODORE. ;2=OSI ;1=MOS TECH,KIM ;0=PDP-10 SIMULATING 6502 INTPRC==1 ;INTEGER ARRAYS. ADDPRC==1 ;FOR ADDITIONAL PRECISION. LNGERR==0 ;LONG ERROR MESSAGES. TIME== 0 ;CAPABILITY TO SET AND READ A CLK. EXTIO== 0 ;EXTERNAL I/O. DISKO== 0 ;SAVE AND LOAD COMMANDS NULCMD==1 ;FOR THE "NULL" COMMAND GETCMD==1 RORSW==1 ROMSW==1 ;TELLS IF THIS IS ON ROM. CLMWID==14 LONGI==1 ;LONG INITIALIZATION SWITCH. STKEND=511 BUFPAG==0 LINLEN==72 ;TERMINAL LINE LENGTH. BUFLEN==72 ;INPUT BUFFER SIZE. ROMLOC= ^O20000 ;ADDRESS OF START OF PURE SEGMENT. KIMROM=1 IFE ROMSW,<KIMROM==0> IFN REALIO-1,<KIMROM==0> IFN ROMSW,< RAMLOC= ^O40000 ;USED ONLY IF ROMSW=1 IFE REALIO,<ROMLOC= ^O20000 ;START AT 8K. RAMLOC=^O1400>> IFE REALIO-3,< DISKO==1 RAMLOC==^O2000 ROMLOC=^O140000 NULCMD==0 GETCMD==1 linlen==40 BUFLEN==81 CQOPEN=^O177700 CQCLOS=^O177703 CQOIN= ^O177706 ;OPEN CHANNEL FOR INPUT CQOOUT=^O177711 ;FILL FOR COMMO. CQCCHN=^O177714 CQINCH=^O177717 ;INCHR'S CALL TO GET A CHARACTER OUTCH= ^O177722 CQLOAD=^O177725 CQSAVE=^O177730 CQVERF=^O177733 CQSYS= ^O177736 ISCNTC=^O177741 CZGETL=^O177744 ;CALL POINT FOR "GET" CQCALL=^O177747 ;CLOSE ALL CHANNELS CQTIMR=^O215 BUFPAG==2 BUF==256BUFPAG STKEND==507 CQSTAT=^O226 CQHTIM=^O164104 EXTIO==1 TIME==1 GETCMD==1 CLMWID==10 PI=255 ;VALUE OF PI CHARACTER FOR COMMODORE. ROMSW==1 RORSW==1 TRMPOS=^O306> IFE REALIO-1,<GETCMD==1 DISKO==1 OUTCH=^O17240 ;1EA0 ROMLOC==^O20000 RORSW==0 CZGETL=^O17132> IFE REALIO-2,< RORSW==0 RAMLOC==^O1000 IFN ROMSW,< RORSW==0 RAMLOC==^O100000> OUTCH==^O177013> IFE REALIO-4,< RORSW==1 NULCMD==0 GETCMD==1 CQINLN==^O176547 CQPRMP==^O63 CQINCH==^O176414 CQCOUT==^O177315 CQCSIN==^O177375 BUFPAG==2 BUF=BUFPAG256 ROMLOC=^O4000 RAMLOC=^O25000 ;PAGE 2A OUTCH=^O176755 CZGETL=^O176414 LINLEN==40 BUFLEN==240 RORSW==1 STKEND=507> IFE RORSW,< DEFINE ROR (WD),< LDAI 0 BCC .+4 LDAI ^O200 LSR WD ORA WD STA WD>> DEFINE ACRLF,< 13 10> DEFINE SYNCHK (Q),< LDAI <Q> JSR SYNCHR> DEFINE DT(Q),< IRPC Q,<IFDIF <Q><">,<EXP "Q">>> DEFINE LDWD (WD),< LDA WD LDY <WD>+1> DEFINE LDWDI (WD),< LDAI <<WD>&^O377> LDYI <<WD>/^O400>> DEFINE LDWX (WD),< LDA WD LDX <WD>+1> DEFINE LDWXI (WD),< LDAI <<WD>&^O377> LDXI <<WD>/^O400>> DEFINE LDXY (WD),< LDX WD LDY <WD>+1> DEFINE LDXYI (WD),< LDXI <<WD>&^O377> LDYI <<WD>/^O400>> DEFINE STWD (WD),< STA WD STY <WD>+1> DEFINE STWX (WD),< STA WD STX <WD>+1> DEFINE STXY (WD),< STX WD STY <WD>+1> DEFINE CLR (WD),< LDAI 0 STA WD> DEFINE COM (WD),< LDA WD EORI ^O377 STA WD> DEFINE PULWD (WD),< PLA STA WD PLA STA <WD>+1> DEFINE PSHWD (WD),< LDA <WD>+1 PHA LDA WD PHA> DEFINE JEQ (WD),< BNE .+5 JMP WD> DEFINE JNE (WD),< BEQ .+5 JMP WD> DEFINE BCCA(Q),< BCC Q> ;BRANCHES THAT ALWAYS BRANCH DEFINE BCSA(Q),< BCS Q> ;THESE ARE USED ON THE 6502 BECAUSE DEFINE BEQA(Q),< BEQ Q> ;THERE IS NO UNCONDITIONAL BRANCH DEFINE BNEA(Q),< BNE Q> DEFINE BMIA(Q),< BMI Q> DEFINE BPLA(Q),< BPL Q> DEFINE BVCA(Q),< BVC Q> DEFINE BVSA(Q),< BVS Q> DEFINE INCW(R),< INC R BNE %Q INC R+1 %Q:> DEFINE SKIP1, <XWD ^O1000,^O044> ;BIT ZERO PAGE TRICK. DEFINE SKIP2, <XWD ^O1000,^O054> ;BIT ABS TRICK. IF1,< IFE REALIO,<PRINTX/SIMULATE/> IFE REALIO-1,<PRINTX KIM> IFE REALIO-2,<PRINTX OSI> IFE REALIO-3,<PRINTX COMMODORE> IFE REALIO-4,<PRINTX APPLE> IFE REALIO-5,<PRINTX STM> IFN ADDPRC,<PRINTX ADDITIONAL PRECISION> IFN INTPRC,<PRINTX INTEGER ARRAYS> IFN LNGERR,<PRINTX LONG ERRORS> IFN DISKO,<PRINTX SAVE AND LOAD> IFE ROMSW,<PRINTX RAM> IFN ROMSW,<PRINTX ROM> IFE RORSW,<PRINTX NO ROR> IFN RORSW,<PRINTX ROR ASSUMED>> PAGE SUBTTL INTRODUCTION AND COMPILATION PARAMETERS. COMMENT --------- ---- -- --------- COPYRIGHT 1976 BY MICROSOFT --------- ---- -- --------- 7/27/78 FIXED BUG WHERE FOR VARIABLE AT BYTE FF MATCHED RETURN SEARCHING FOR GOSUB ENTRY ON STACK IN FNDFOR CALL BY CHANGING STA FORPNT TO STA FORPNT+1. THIS IS A SERIOUS BUG IN ALL VERSIONS. 7/27/78 FIXED BUG AT NEWSTT UNDER IFN BUFPAG WHEN CHECK OF CURLIN WAS DONE BEFORE CURLIN SET UP SO INPUT RETRIES OF FIRST STATEMENT WAS GIVING SYNTAX ERROR INSTEAD OF REDO FROM START (CODE WAS 12/1/77 FIX) 7/1/78 SAVED A FEW BYTES IN INIT FOR COMMODORE (14) 7/1/78 FIXED BUG WHERE REPLACING A LINE OVERFLOWING MEMORY LEFT LINKS IN A BAD STATE. (CODE AT NODEL AND FINI) BUG#4 7/1/78 FIXED BUG WHERE GARBAGE COLLECTION NEVER(!) COLLECTS TEMPS (STY GRBPNT AT FNDVAR, LDA GRBPNT ORA GRBPNT+1 AT GRBPAS) THIS WAS COMMODORE BUG #2 7/1/78 FIXED BUG WHERE DELETE/INSERT OF LINE COULD CAUSE A GARBAGE COLLECTION WITH BAD VARTAB IF OUT OF MEMORY (LDWD MEMSIZ STWD FRETOP=JSR RUNC CLC ALSO AT NODEL) 3/9/78 EDIT TO FIX COMMO TRMPOS AND CHANGE LEFT$ AND RIGHT$ TO ALLOW A SECOND ARGUMENT OF 0 AND RETURN A NULL STRING 2/25/78 FIXED BUG THAT INPFLG WAS SET WRONG WHEN BUFPAG.NE.0 INCREASED NUMLEV FROM 19 TO 23 2/11/78 DISALLOWED SPACES IN RESERVED WORDS. PUT IN SPECIAL CHECK FOR "GO TO" 2/11/78 FIXED BUG WHERE ROUNDING OF THE FAC BEFORE PUSHING COULD CAUSE A STRING POINTER IN THE FAC TO BE INCREMENTED 1/24/78 fixed problem where user defined function undefined check fix was smashing error number in [x] 12/1/77 FIXED PROBLEM WHERE PEEK WAS SMASHING (POKER) CAUSING POKE OF PEEK TO FAIL 12/1/77 FIXED PROBLEM WHERE PROBLEM WITH VARTXT=LINNUM=BUF-2 CAUSING BUF-1 COMMA TO DISAPPEAR 12/1/77 FIXED BUFPAG.NE.0 PROBLEM AT NEWSTT AND STOP : CODE WAS STILL ASSUMING TXTPTR+1.EQ.0 IFF STATEMENT WAS DIRECT NUMLEV==23 ;NUMBER OF STACK LEVELS RESERVED ;BY AN EXPLICIT CALL TO "GETSTK". STRSIZ==3 ;# OF LOCS PER STRING DESCRIPTOR. NUMTMP==3 ;NUMBER OF STRING TEMPORARIES. CONTW==15 ;CHARACTER TO SUPPRESS OUTPUT. PAGE SUBTTL SOME EXPLANATION. COMMENT M6502 BASIC CONFIGURES BASIC AS FOLLOWS LOW LOCATIONS PAGE ZERO STARTUP: INITIALLY A JMP TO INITIALIZATION CODE BUT CHANGED TO A JMP TO "READY". RESTARTING THE MACHINE AT LOC 0 DURING PROGRAM EXECUTION CAN LEAVE THINGS MESSED UP. LOC OF FAC TO INTEGER AND INTEGER TO FAC ROUTINES. "DIRECT" MEMORY: THESE ARE THE MOST COMMONLY USED LOCATIONS. THEY HOLD BOOKKEEPING INFO AND ALL OTHER FREQUENTLY USED INFORMATION. ALL TEMPORARIES, FLAGS, POINTERS, THE BUFFER AREA, THE FLOATING ACCUMULATOR, AND ANYTHING ELSE THAT IS USED TO STORE A CHANGING VALUE SHOULD BE LOCATED IN THIS AREA. CARE MUST BE MADE IN MOVING LOCATIONS IN THIS AREA SINCE THE JUXTAPOSITION OF TWO LOCATIONS IS OFTEN DEPENDED UPON. STILL IN RAM WE HAVE THE BEGINNING OF THE "CHRGET" SUBROUTINE. IT IS HERE SO [TXTPTR] CAN BE THE EXTENDED ADDRESS OF A LOAD INSTRUCTION. THIS SAVES HAVING TO BOTHER ANY REGISTERS. PAGE ONE THE STACK. STORAGE PAGE TWO AND ON IN RAM VERSIONS THESE DATA STRUCTURES COME AT THE END OF BASIC. IN ROM VERSON THEY ARE AT RAMLOC WHICH CAN EITHER BE ABOVE OR BELOW ROMLOC, WHICH IS WHERE BASIC ITSELF RESIDES. A ZERO. [TXTTAB] POINTER TO NEXT LINE'S POINTER. LINE # OF THIS LINE (2 BYTES). CHARACTERS ON THIS LINE. ZERO. POINTER AT NEXT LINE'S POINTER (POINTED TO BY THE ABOVE POINTER). ... REPEATS ... LAST LINE: POINTER AT ZERO POINTER. LINE # OF THIS LINE. CHARACTERS ON THIS LINE. ZERO. DOUBLE ZERO (POINTED TO BY THE ABOVE POINTER). [VARTAB] SIMPLE VARIABLES. 6 BYTES PER VALUE. 2 BYTES GIVE THE NAME, 4 BYTES THE VALUE. ... REPEATS ... [ARYTAB] ARRAY VARIABLES. 2 BYTES NAME, 2 BYTE LENGTH, NUMBER OF DIMENSIONS , EXTENT OF EACH DIMENSION (2BYTES/), VALUES ... REPEATS ... [STREND] FREE SPACE. ... REPEATS ... [FRETOP] STRING SPACE IN USE. ... REPEATS ... [MEMSIZ] HIGHEST MACHINE LOCATION. UNUSED EXCEPT BY THE VAL FUNCTION. ROM -- CONSTANTS AND CODE. FUNCTION DISPATCH ADDRESSES (AT ROMLOC) "FUNDSP" CONTAINS THE ADDRESSES OF THE FUNCTION ROUTINES IN THE ORDER OF THE FUNCTION NAMES IN THE CRUNCH LIST. THE FUNCTIONS THAT TAKE MORE THAN ONE ARGUMENT ARE AT THE END. SEE THE EXPLANATION AT "ISFUN". THE OPERATOR LIST THE "OPTAB" LIST CONTAINS AN OPERATOR'S PRECEDENCE FOLLOWED BY THE ADDRESS OF THE ROUTINE TO PERFORM THE OPERATION. THE INDEX INTO THE OPERATOR LIST IS MADE BY SUBTRACTING OFF THE CRUNCH VALUE OF THE LOWEST NUMBERED OPERATOR. THE ORDER OF OPERATORS IN THE CRUNCH LIST AND IN "OPTAB" IS IDENTICAL. THE PRECEDENCES ARE ARBITRARY EXCEPT FOR THEIR COMPARATIVE SIZES. NOTE THAT THE PRECEDENCE FOR UNARY OPERATORS SUCH AS "NOT" AND NEGATION ARE SETUP SPECIALLY WITHOUT USING THE LIST. THE RESERVED WORD OR CRUNCH LIST WHEN A COMMAND OR PROGRAM LINE IS TYPED IN IT IS STORED IN "BUF". AS SOON AS THE WHOLE LINE HAS BEEN TYPED IN ("INLIN" RETURNS) "CRUNCH" IS CALLED TO CONVERT ALL RESERVED WORDS TO THEIR CRUNCHED VALUES. THIS REDUCES THE SIZE OF THE PROGRAM AND SPEEDS UP EXECUTION BY ALLOWING LIST DISPATCHES TO PERFORM FUNCTIONS, STATEMENTS, AND OPERATIONS. THIS IS BECAUSE ALL THE STATEMENT NAMES ARE STORED CONSECUTIVELY IN THE CRUNCH LIST. WHEN A MATCH IS FOUND BETWEEN A STRING OF CHARACTERS AND A WORD IN THE CRUNCH LIST THE ENTIRE TEXT OF THE MATCHED WORD IS TAKEN OUT OF THE INPUT LINE AND A RESERVED WORD TOKEN IS PUT IN ITS PLACE. A RESERVED WORD TOKEN IS ALWAYS EQUAL TO OCTAL 200 PLUS THE POSITION OF THE MATCHED WORD IN THE CRUNCH LIST. STATEMENT DISPATCH ADDRESSES WHEN A STATEMENT IS TO BE EXECUTED, THE FIRST CHARACTER OF THE STATEMENT IS EXAMINED TO SEE IF IT IS LESS THAN THE RESERVED WORD TOKEN FOR THE LOWEST NUMBERED STATEMENT NAME. IF SO, THE "LET" CODE IS CALLED TO TREAT THE STATEMENT AS AN ASSIGNMENT STATEMENT. OTHERWISE A CHECK IS MADE TO MAKE SURE THE RESERVED WORD NUMBER IS NOT TOO LARGE TO BE A STATEMENT TYPE NUMBER. IF NOT THE ADDRESS TO DISPATCH TO IS FETCHED FROM "STMDSP" (THE STATEMENT DISPATCH LIST) USING THE RESERVED WORD NUMBER FOR THE STATEMENT TO CALCULATE AN INDEX INTO THE LIST. ERROR MESSAGES WHEN AN ERROR CONDITION IS DETECTED, [ACCX] MUST BE SET UP TO INDICATE WHICH ERROR MESSAGE IS APPROPRIATE AND A BRANCH MUST BE MADE TO "ERROR". THE STACK WILL BE RESET AND ALL PROGRAM CONTEXT WILL BE LOST. VARIABLES VALUES AND THE ACTUAL PROGRAM REMAIN INTACT. ONLY THE VALUE OF [ACCX] IS IMPORTANT WHEN THE BRANCH IS MADE TO ERROR. [ACCX] IS USED AS AN INDEX INTO "ERRTAB" WHICH GIVES THE TWO CHARACTER ERROR MESSAGE THAT WILL BE PRINTED ON THE USER'S TERMINAL. TEXTUAL MESSAGES CONSTANT MESSAGES ARE STORED HERE. UNLESS THE CODE TO CHECK IF A STRING MUST BE COPIED IS CHANGED THESE STRINGS MUST BE STORED ABOVE PAGE ZERO, OR ELSE THEY WILL BE COPIED BEFORE THEY ARE PRINTED. FNDFOR MOST SMALL ROUTINES ARE FAIRLY SIMPLE AND ARE DOCUMENTED IN PLACE. "FNDFOR" IS USED FOR FINDING "FOR" ENTRIES ON THE STACK. WHENEVER A "FOR" IS EXECUTED, A 16-BYTE ENTRY IS PUSHED ONTO THE STACK. BEFORE THIS IS DONE, HOWEVER, A CHECK MUST BE MADE TO SEE IF THERE ARE ANY "FOR" ENTRIES ALREADY ON THE STACK FOR THE SAME LOOP VARIABLE. IF SO, THAT "FOR" ENTRY AND ALL OTHER "FOR" ENTRIES THAT WERE MADE AFTER IT ARE ELIMINATED FROM THE STACK. THIS IS SO A PROGRAM THAT JUMPS OUT OF THE MIDDLE OF A "FOR" LOOP AND THEN RESTARTS THE LOOP AGAIN AND AGAIN WON'T USE UP 18 BYTES OF STACK SPACE EVERY TIME. THE "NEXT" CODE ALSO CALLS "FNDFOR" TO SEARCH FOR A "FOR" ENTRY WITH THE LOOP VARIABLE IN THE "NEXT". AT WHATEVER POINT A MATCH IS FOUND THE STACK IS RESET. IF NO MATCH IS FOUND A "NEXT WITHOUT FOR" ERROR OCCURS. GOSUB EXECUTION ALSO PUTS A 5-BYTE ENTRY ON STACK. WHEN A RETURN IS EXECUTED "FNDFOR" IS CALLED WITH A VARIABLE POINTER THAT CAN'T BE MATCHED. WHEN "FNDFOR" HAS RUN THROUGH ALL THE "FOR" ENTRIES ON THE STACK IT RETURNS AND THE RETURN CODE MAKES SURE THE ENTRY THAT WAS STOPPED ON IS A GOSUB ENTRY. THIS ASSURES THAT IF YOU GOSUB TO A SECTION OF CODE IN WHICH A FOR LOOP IS ENTERED BUT NEVER EXITED THE RETURN WILL STILL BE ABLE TO FIND THE MOST RECENT GOSUB ENTRY. THE "RETURN" CODE ELIMINATES THE "GOSUB" ENTRY AND ALL "FOR" ENTRIES MADE AFTER THE GOSUB ENTRY. NON-RUNTIME STUFF THE CODE TO INPUT A LINE, CRUNCH IT, GIVE ERRORS, FIND A SPECIFIC LINE IN THE PROGRAM, PERFORM A "NEW", "CLEAR", AND "LIST" ARE ALL IN THIS AREA. GIVEN THE EXPLANATION OF PROGRAM STORAGE SET FORTH ABOVE, THESE ARE ALL STRAIGHTFORWARD. NEWSTT WHENEVER A STATEMENT FINISHES EXECUTION IT DOES A "RTS" WHICH TAKES EXECUTION BACK TO "NEWSTT". STATEMENTS THAT CREATE OR LOOK AT SEMI-PERMANENT STACK ENTRIES MUST GET RID OF THE RETURN ADDRESS OF "NEWSTT" AND JMP TO "NEWSTT" WHEN DONE. "NEWSTT" ALWAYS CHRGETS THE FIRST CHARACTER AFTER THE STATEMENT NAME BEFORE DISPATCHING. WHEN RETURNING BACK TO "NEWSTT" THE ONLY THING THAT MUST BE SET UP IS THE TEXT POINTER IN "TXTPTR". "NEWSTT" WILL CHECK TO MAKE SURE "TXTPTR" IS POINTING TO A STATEMENT TERMINATOR. IF A STATEMENT SHOULDN'T BE PERFORMED UNLESS IT IS PROPERLY FORMATTED (I.E. "NEW") IT CAN SIMPLY DO A RETURN AFTER READING ALL OF ITS ARGUMENTS. SINCE THE ZERO FLAG BEING OFF INDICATES THERE IS NOT A STATEMENT TERMINATOR "NEWSTT" WILL DO THE JMP TO THE "SYNTAX ERROR" ROUTINE. IF A STATEMENT SHOULD BE STARTED OVER IT CAN DO LDWD OLDTXT, STWD TXTPTR RTS SINCE THE TEXT PNTR AT "NEWSTT" IS ALWAYS STORED IN "OLDTXT". THE ^C CODE STORES [CURLIN] (THE CURRENT LINE NUMBER) IN "OLDLIN" SINCE THE ^C CHECK IS MADE BEFORE THE STATEMENT POINTED TO IS EXECUTED. "STOP" AND "END" STORE THE TEXT POINTER FROM "TXTPTR", WHICH POINTS AT THEIR TERMINATING CHARACTER, IN "OLDTXT". STATEMENT CODE THE INDIVIDUAL STATEMENT CODE COMES NEXT. THE APPROACH USED IN EXECUTING EACH STATEMENT IS DOCUMENTED IN THE STATEMENT CODE ITSELF. FRMEVL, THE FORMULA EVALUATOR GIVEN A TEXT POINTER POINTING TO THE STARTING CHARACTER OF A FORMULA, "FRMEVL" EVALUATES THE FORMULA AND LEAVES THE VALUE IN THE FLOATING ACCUMULATOR (FAC). "TXTPTR" IS RETURNED POINTING TO THE FIRST CHARACTER THAT COULD NOT BE INTERPRETED AS PART OF THE FORMULA. THE ALGORITHM USES THE STACK TO STORE TEMPORARY RESULTS: 0. PUT A DUMMY PRECEDENCE OF ZERO ON THE STACK. 1. READ LEXEME (CONSTANT,FUNCTION, VARIABLE,FORMULA IN PARENS) AND TAKE THE LAST PRECEDENCE VALUE OFF THE STACK. 2. SEE IF THE NEXT CHARACTER IS AN OPERATOR. IF NOT, CHECK PREVIOUS ONE. THIS MAY CAUSE OPERATOR APPLICATION OR AN ACTUAL RETURN FROM "FRMEVL". 3. IF IT IS, SEE WHAT PRECEDENCE IT HAS AND COMPARE IT TO THE PRECEDENCE OF THE LAST OPERATOR ON THE STACK. 4. IF = OR LESS REMEMBER THE OPERATOR POINTER OF THIS OPERATOR AND BRANCH TO "QCHNUM" TO CAUSE APPLICATION OF THE LAST OPERATOR. EVENTUALLY RETURN TO STEP 2 BY RETURNING TO JUST AFTER "DOPREC". 5. IF GREATER PUT THE LAST PRECEDENCE BACK ON, SAVE THE OPERATOR ADDRESS, CURRENT TEMPORARY RESULT, AND PRECEDENCE AND RETURN TO STEP 1. RELATIONAL OPERATORS ARE ALL HANDLED THROUGH A COMMON ROUTINE. SPECIAL CARE IS TAKEN TO DETECT TYPE MISMATCHES SUCH AS 3+"F". EVAL -- THE ROUTINE TO READ A LEXEME "EVAL" CHECKS FOR THE DIFFERENT TYPES OF ENTITIES IT IS SUPPOSED TO DETECT. LEADING PLUSES ARE IGNORED, DIGITS AND "." CAUSE "FIN" (FLOATING INPUT) TO BE CALLED. FUNCTION NAMES CAUSE THE FORMULA INSIDE THE PARENTHESES TO BE EVALUATED AND THE FUNCTION ROUTINE TO BE CALLED. VARIABLE NAMES CAUSE "PTRGET" TO BE CALLED TO GET A POINTER TO THE VALUE, AND THEN THE VALUE IS PUT INTO THE FAC. AN OPEN PARENTHESIS CAUSES "FRMEVL" TO BE CALLED (RECURSIVELY), AND THE ")" TO BE CHECKED FOR. UNARY OPERATORS (NOT AND NEGATION) PUT THEIR PRECEDENCE ON THE STACK AND ENTER FORMULA EVALUATION AT STEP 1, SO THAT EVERYTHING UP TO AN OPERATOR GREATER THAN THEIR PRECEDENCE OR THE END OF THE FORMULA WILL BE EVALUATED. DIMENSION AND VARIABLE SEARCHING SPACE IS ALLOCATED FOR VARIABLES AS THEY ARE ENCOUNTERED. THUS "DIM" STATEMENTS MUST BE EXECUTED TO HAVE EFFECT. 6 BYTES ARE ALLOCATED FOR EACH SIMPLE VARIABLE, WHETHER IT IS A STRING, NUMBER OR USER DEFINED FUNCTION. THE FIRST TWO BYTES GIVE THE NAME OF THE VARIABLE AND THE LAST FOUR GIVE ITS VALUE. [VARTAB] GIVES THE FIRST LOCATION WHERE A SIMPLE VARIABLE NAME IS FOUND AND [ARYTAB] GIVES THE LOCATION TO STOP SEARCHING FOR SIMPLE VARIABLES. A "FOR" ENTRY HAS A TEXT POINTER AND A POINTER TO A VARIABLE VALUE SO NEITHER THE PROGRAM OR THE SIMPLE VARIABLES CAN BE MOVED WHILE THERE ARE ACTIVE "FOR" ENTRIES ON THE STACK. USER DEFINED FUNCTION VALUES ALSO CONTAIN POINTERS INTO SIMPLE VARIABLE SPACE SO NO USER-DEFINED FUNCTION VALUES CAN BE RETAINED IF SIMPLE VARIABLES ARE MOVED. ADDING A SIMPLE VARIABLE IS JUST ADDING SIX TO [ARYTAB] AND [STREND], BLOCK TRANSFERING THE ARRAY VARIABLES UP BY SIX AND MAKING SURE THE NEW [STREND] IS NOT TOO CLOSE TO THE STRINGS. THIS MOVEMENT OF ARRAY VARIABLES MEANS THAT NO POINTER TO AN ARRAY WILL STAY VALID WHEN NEW SIMPLE VARIABLES CAN BE ENCOUNTERED. THIS IS WHY ARRAY VARIABLES ARE NOT ALLOWED FOR "FOR" LOOP VARIABLES. SETTING UP A NEW ARRAY VARIABLE MERELY INVOLVES BUILDING THE DESCRIPTOR, UPDATING [STREND], AND MAKING SURE THERE IS STILL ENOUGH ROOM BETWEEN [STREND] AND STRING SPACE. "PTRGET", THE ROUTINE WHICH RETURNS A POINTER TO A VARIABLE VALUE, HAS TWO IMPORTANT FLAGS. ONE IS "DIMFLG" WHICH INDICATES WHETHER "DIM" CALLED "PTRGET" OR NOT. IF SO, NO PRIOR ENTRY FOR THE VARIABLE IN QUESTION SHOULD BE FOUND, AND THE INDEX INDICATES HOW MUCH SPACE TO SET ASIDE. SIMPLE VARIABLES CAN BE "DIMENSIONED", BUT THE ONLY EFFECT WILL BE TO SET ASIDE SPACE FOR THE VARIABLE IF IT HASN'T BEEN ENCOUNTERED YET. THE OTHER IMPORTANT FLAG IS "SUBFLG" WHICH INDICATES WHETHER A SUBSCRIPTED VARIABLE SHOULD BE ALLOWED IN THE CURRENT CONTEXT. IF [SUBFLG] IS NON-ZERO THE OPEN PARENTHESIS FOR A SUBSCRIPTED VARIABLE WILL NOT BE SCANNED BY "PTRGET", AND "PTRGET" WILL RETURN WITH A TEXT POINTER POINTING TO THE "(", IF THERE WAS ONE. STRINGS IN THE VARIABLE TABLES STRINGS ARE STORED JUST LIKE NUMERIC VARIABLES. SIMPLE STRINGS HAVE THREE VALUE BYTES WHICH ARE INITIALIZED TO ALL ZEROS (WHICH REPRESENTS THE NULL STRING). THE ONLY DIFFERENCE IN HANDLING IS THAT WHEN "PTRGET" SEES A "$" AFTER THE NAME OF A VARIABLE, "PTRGET" SETS [VALTYP] TO NEGATIVE ONE AND TURNS ON THE MSB (MOST-SIGNIFIGANT-BIT) OF THE VALUE OF THE FIRST CHARACTER OF THE VARIABLE NAME. HAVING THIS BIT ON IN THE NAME OF THE VARIABLE ENSURES THAT THE SEARCH ROUTINE WILL NOT MATCH 'A' WITH 'A$' OR 'A$' WITH 'A'. THE MEANING OF THE THREE VALUE BYTES ARE: LOW LENGTH OF THE STRING LOW 8 BITS HIGH 8 BITS OF THE ADDRESS OF THE CHARACTERS IN THE STRING IF LENGTH.NE.0. MEANINGLESS OTHERWISE. HIGH THE VALUE OF A STRING VARIABLE (THESE 3 BYTES) IS CALLED THE STRING DESCRIPTOR TO DISTINGUISH IT FROM THE ACTUAL STRING DATA. WHENEVER A STRING CONSTANT IS ENCOUNTERED IN A FORMULA OR AS PART OF AN INPUT STRING, OR AS PART OF DATA, "STRLIT" IS CALLED, CAUSING A DESCRIPTOR TO BE BUILT FOR THE STRING. WHEN ASSIGNMENT IS MADE TO A STRING POINTING INTO "BUF" THE VALUE IS COPIED INTO STRING SPACE SINCE [BUF] IS ALWAYS CHANGING. STRING FUNCTIONS AND THE ONE STRING OPERATOR "+" ALWAYS RETURN THEIR VALUES IN STRING SPACE. ASSIGNING A STRING A CONSTANT VALUE IN A PROGRAM THROUGH A "READ" OR ASSIGNMENT STATEMENT WILL NOT USE ANY STRING SPACE SINCE THE STRING DESCRIPTOR WILL POINT INTO THE PROGRAM ITSELF. IN GENERAL, COPYING IS DONE WHEN A STRING VALUE IS IN "BUF", OR IT IS IN STRING SPACE AND THERE IS AN ACTIVE POINTER TO IT. THUS F$=G$ WILL CAUSE COPYING IF G$ HAS ITS STRING DATA IN STRING SPACE. F$=CHR$(7) WILL USE ONE BYTE OF STRING SPACE TO STORE THE NEW ONE CHARACTER STRING CREATED BY "CHR$", BUT THE ASSIGNMENT ITSELF WILL CAUSE NO COPYING SINCE THE ONLY POINTER AT THE NEW STRING IS A TEMPORARY DESCRIPTOR CREATED BY "FRMEVL" WHICH WILL GO AWAY AS SOON AS THE ASSIGNMENT IS DONE. IT IS THE NATURE OF GARBAGE COLLECTION THAT DISALLOWS HAVING TWO STRING DESCRIPTORS POINT TO THE SAME AREA IN STRING SPACE. STRING FUNCTIONS AND OPERATORS MUST PROCEED AS FOLLOWS: 1) FIGURE OUT THE LENGTH OF THEIR RESULT. 2) CALL "GETSPA" TO FIND SPACE FOR THEIR RESULT. THE ARGUMENTS TO THE FUNCTION OR OPERATOR MAY CHANGE SINCE GARBAGE COLLECTION MAY BE INVOKED. THE ONLY THING THAT CAN BE SAVED DURING THE CALL TO "GETSPA" IS A POINTER TO THE DESCRIPTORS OF THE ARGUMENTS. 3) CONSTRUCT THE RESULT DESCRIPTOR IN "DSCTMP". "GETSPA" RETURNS THE LOCATION OF THE AVAILABLE SPACE. 4) CREATE THE NEW VALUE BY COPYING PARTS OF THE ARGUMENTS OR WHATEVER. 5) FREE UP THE ARGUMENTS BY CALLING "FRETMP". 6) JUMP TO "PUTNEW" TO GET THE DESCRIPTOR IN "DSCTMP" TRANSFERRED INTO A NEW STRING TEMPORARY. THE REASON FOR STRING TEMPORARIES IS THAT GARBAGE COLLECTION HAS TO KNOW ABOUT ALL ACTIVE STRING DESCRIPTORS SO IT KNOWS WHAT IS AND ISN'T IN USE. STRING TEMPORARIES ARE USED TO STORE THE DESCRIPTORS OF STRING EXPRESSIONS. INSTEAD OF HAVING AN ACTUAL VALUE STORED IN THE FAC, AND HAVING THE VALUE OF A TEMPORARY RESULT BEING SAVED ON THE STACK, AS HAPPENS WITH NUMERIC VARIABLES, STRINGS HAVE THE POINTER TO A STRING DESCRIPTOR STORED IN THE FAC, AND IT IS THIS POINTER THAT GETS SAVED ON THE STACK BY FORMULA EVALUATION. STRING FUNCTIONS CANNOT FREE THEIR ARGUMENTS UP RIGHT AWAY SINCE "GETSPA" MAY FORCE GARBAGE COLLECTION AND THE ARGUMENT STRINGS MAY BE OVER-WRITTEN SINCE GARBAGE COLLECTION WILL NOT BE ABLE TO FIND AN ACTIVE POINTER TO THEM. FUNCTION AND OPERATOR RESULTS ARE BUILT IN "DSCTMP" SINCE STRING TEMPORARIES ARE ALLOCATED (PUTNEW) AND DEALLOCATED (FRETMP) IN A FIFO ORDERING (I.E. A STACK) SO THE NEW TEMPORARY CANNOT BE SET UP UNTIL THE OLD ONE(S) ARE FREED. TRYING TO BUILD A RESULT IN A TEMPORARY AFTER FREEING UP THE ARGUMENT TEMPORARIES COULD RESULT IN ONE OF THE ARGUMENT TEMPORARIES BEING OVERWRITTEN TOO SOON BY THE NEW RESULT. STRING SPACE IS ALLOCATED AT THE VERY TOP OF MEMORY. "MEMSIZ" POINTS BEYOND THE LAST LOCATION OF STRING SPACE. STRINGS ARE STORED IN HIGH LOCATIONS FIRST. WHENEVER STRING SPACE IS ALLOCATED (GETSPA). [FRETOP], WHICH IS INITIALIZED TO [MEMSIZ], IS UPDATED TO GIVE THE HIGHEST LOCATION IN STRING SPACE THAT IS NOT IN USE. THE RESULT IS THAT [FRETOP] GETS SMALLER AND SMALLER, UNTIL SOME ALLOCATION WOULD MAKE [FRETOP] LESS THAN OR EQUAL TO [STREND]. THIS MEANS STRING SPACE HAS RUN INTO THE THE ARRAYS AND THAT GARBAGE COLLECTION MUST BE CALLED. GARBAGE COLLECTION: 0. [MINPTR]=[STREND] [FRETOP]=[MEMSIZ] 1. [REMMIN]=0 2. FOR EACH STRING DESCRIPTOR (TEMPORARIES, SIMPLE STRINGS, STRING ARRAYS) IF THE STRING IS NOT NULL AND ITS POINTER IS .GT.MINPTR AND .LT.FRETOP, [MINPTR]=THIS STRING DESCRIPTOR'S POINTER, [REMMIN]=POINTER AT THIS STRING DESCRIPTOR. END. 3. IF REMMIN.NE.0 (WE FOUND AN UNCOLLECTED STRING), BLOCK TRANSFER THE STRING DATA POINTED TO IN THE STRING DESCRIPTOR POINTED TO BY "REMMIN" SO THAT THE LAST BYTE OF STRING DATA IS AT [FRETOP]. UPDATE [FRETOP] SO THAT IT POINTS TO THE LOCATION JUST BELOW THE ONE THE STRING DATA WAS MOVED INTO. UPDATE THE POINTER IN THE DESCRIPTOR SO IT POINTS TO THE NEW LOCATION OF THE STRING DATA. GO TO STEP 1. AFTER CALLING GARBAGE COLLECTION "GETSPA" AGAIN CHECKS TO SEE IF [ACCA] CHARACTERS ARE AVAILABLE BETWEEN [STREND] AND [FRETOP]; IF NOT, AN "OUT OF STRING" ERROR IS INVOKED. MATH PACKAGE THE MATH PACKAGE CONTAINS FLOATING INPUT (FIN), FLOATING OUTPUT (FOUT), FLOATING COMPARE (FCOMP) ... AND ALL THE NUMERIC OPERATORS AND FUNCTIONS. THE FORMATS, CONVENTIONS AND ENTRY POINTS ARE ALL DESCRIBED IN THE MATH PACKAGE ITSELF. INIT -- THE INITIALIZATION ROUTINE THE AMOUNT OF MEMORY, TERMINAL WIDTH, AND WHICH FUNCTIONS TO BE RETAINED ARE ASCERTAINED FROM THE USER. A ZERO IS PUT DOWN AT THE FIRST LOCATION NOT USED BY THE MATH-PACKAGE AND [TXTTAB] IS SET UP TO POINT AT THE NEXT LOCATION. THIS DETERMINES WHERE PROGRAM STORAGE WILL START. SPECIAL CHECKS ARE MADE TO MAKE SURE ALL QUESTIONS IN "INIT" ARE ANSWERED REASONABLY, SINCE ONCE "INIT" FINISHES, THE LOCATIONS IT USES ARE USED FOR PROGRAM STORAGE. THE LAST THING "INIT" DOES IS CHANGE LOCATION ZERO TO BE A JUMP TO "READY" INSTEAD OF "INIT". ONCE THIS IS DONE THERE IS NO WAY TO RESTART "INIT". HIGH LOCATIONS PAGE SUBTTL PAGE ZERO. IFN REALIO-3,< START: JMP INIT ;INITIALIZE - SETUP CERTAIN LOCATIONS ;AND DELETE FUNCTIONS IF NOT NEEDED, ;AND CHANGE THIS TO "JMP READY" ;IN CASE USER RESTARTS AT LOC ZERO. RDYJSR: JMP INIT ;CHANGED TO "JMP STROUT" BY "INIT" ;TO HANDLE ERRORS. ADRAYI: ADR(AYINT) ;STORE HERE THE ADDR OF THE ;ROUTINE TO TURN THE FAC INTO A ;TWO BYTE SIGNED INTEGER IN [Y,A] ADRGAY: ADR(GIVAYF)> ;STORE HERE THE ADDR OF THE ;ROUTINE TO CONVERT [Y,A] TO A FLOATING ;POINT NUMBER IN THE FAC. IFN ROMSW,< USRPOK: JMP FCERR> ;SET UP ORIG BY INIT. ; ; THIS IS THE "VOLATILE" STORAGE AREA AND NONE OF IT ; CAN BE KEPT IN ROM. ANY CONSTANTS IN THIS AREA CANNOT ; BE KEPT IN A ROM, BUT MUST BE LOADED IN BY THE ; PROGRAM INSTRUCTIONS IN ROM. ; ; --- GENERAL RAM ---: CHARAC: BLOCK 1 ;A DELIMITING CHARACTER. INTEGR= CHARAC ;A ONE-BYTE INTEGER FROM "QINT". ENDCHR: BLOCK 1 ;THE OTHER DELIMITING CHARACTER. COUNT: BLOCK 1 ;A GENERAL COUNTER. ; --- FLAGS ---: DIMFLG: BLOCK 1 ;IN GETTING A POINTER TO A VARIABLE ;IT IS IMPORTANT TO REMEMBER WHETHER IT ;IS BEING DONE FOR "DIM" OR NOT. ;DIMFLG AND VALTYP MUST BE ;CONSECUTIVE LOCATIONS. KIMY= DIMFLG ;PLACE TO PRESERVE Y DURING OUT. VALTYP: BLOCK 1 ;THE TYPE INDICATOR. ;0=NUMERIC 1=STRING. IFN INTPRC,< INTFLG: BLOCK 1> ;TELLS IF INTEGER. DORES: BLOCK 1 ;WHETHER CAN OR CAN'T CRUNCH RES'D WORDS. ;TURNED ON WHEN "DATA" ;BEING SCANNED BY CRUNCH SO UNQUOTED ;STRINGS WON'T BE CRUNCHED. GARBFL= DORES ;WHETHER TO DO GARBAGE COLLECTION. SUBFLG: BLOCK 1 ;FLAG WHETHER SUB'D VARIABLE ALLOWED. ;"FOR" AND USER-DEFINED FUNCTION ;POINTER FETCHING TURN ;THIS ON BEFORE CALLING "PTRGET" ;SO ARRAYS WON'T BE DETECTED. ;"STKINI" AND "PTRGET" CLEAR IT. ;ALSO DISALLOWS INTEGERS THERE. INPFLG: BLOCK 1 ;FLAGS WHETHER WE ARE DOING "INPUT" ;OR "READ". TANSGN: BLOCK 1 ;USED IN DETERMINING SIGN OF TANGENT. IFN REALIO,< CNTWFL: BLOCK 1> ;SUPPRESS OUTPUT FLAG. ;NON-ZERO MEANS SUPPRESS. ;RESET BY "INPUT", READY AND ERRORS. ;COMPLEMENTED BY INPUT OF ^O. IFE REALIO-4,<ORG 80> ;ROOM FOR APPLE PAGE 0 STUFF. ; --- RAM DEALING WITH TERMINAL HANDLING ---: IFN EXTIO,< CHANNL: BLOCK 1> ;HOLDS CHANNEL NUMBER. IFN NULCMD,< NULCNT: 0> ;NUMBER OF NULLS TO PRINT. IFN REALIO-3,< TRMPOS: BLOCK 1> ;POSITION OF TERMINAL CARRIAGE. LINWID: LINLEN ;LENGTH OF LINE (WIDTH). NCMWID: NCMPOS ;POSITION BEYOND WHICH THERE ARE ;NO MORE FIELDS. LINNUM: 0 ;LOCATION TO STORE LINE NUMBER BEFORE BUF ;SO THAT "BLTUC" CAN STORE IT ALL AWAY AT ONCE. 44 ;A COMMA (PRELOAD OR FROM ROM) ;USED BY INPUT STATEMENT SINCE THE ;DATA POINTER ALWAYS STARTS ON A ;COMMA OR TERMINATOR. IFE BUFPAG,< BUF: BLOCK BUFLEN> ;TYPE IN STORED HERE. ;DIRECT STATEMENTS EXECUTE OUT OF ;HERE. REMEMBER "INPUT" SMASHES BUF. ;MUST BE ON PAGE ZERO ;OR ASSIGNMENT OF STRING ;VALUES IN DIRECT STATEMENTS WON'T COPY ;INTO STRING SPACE -- WHICH IT MUST. ;N.B. TWO NONZERO BYTES MUST PRECEDE "BUFLNM". ; --- STORAGE FOR TEMPORARY THINGS ---: TEMPPT: BLOCK 1 ;POINTER AT FIRST FREE TEMP DESCRIPTOR. ;INITIALIZED TO POINT TO TEMPST. LASTPT: BLOCK 2 ;POINTER TO LAST-USED STRING TEMPORARY. TEMPST: BLOCK STRSIZNUMTMP ;STORAGE FOR NUMTMP TEMP DESCRIPTORS. INDEX1: BLOCK 2 ;INDEXES. INDEX= INDEX1 INDEX2: BLOCK 2 RESHO: BLOCK 1 ;RESULT OF MULTIPLIER AND DIVIDER. IFN ADDPRC,< RESMOH: BLOCK 1> ;ONE MORE BYTE. RESMO: BLOCK 1 RESLO: BLOCK 1 ADDEND= RESMO ;TEMPORARY USED BY "UMULT". 0 ;OVERFLOW FOR RES. ; --- POINTERS INTO DYNAMIC DATA STRUCTURES ---; TXTTAB: BLOCK 2 ;POINTER TO BEGINNING OF TEXT. ;DOESN'T CHANGE AFTER BEING ;SETUP BY "INIT". VARTAB: BLOCK 2 ;POINTER TO START OF SIMPLE ;VARIABLE SPACE. ;UPDATED WHENEVER THE SIZE OF THE ;PROGRAM CHANGES, SET TO [TXTTAB] ;BY "SCRATCH" ("NEW"). ARYTAB: BLOCK 2 ;POINTER TO BEGINNING OF ARRAY ;TABLE. ;INCREMENTED BY 6 WHENEVER ;A NEW SIMPLE VARIABLE IS FOUND, AND ;SET TO [VARTAB] BY "CLEARC". STREND: BLOCK 2 ;END OF STORAGE IN USE. ;INCREASED WHENEVER A NEW ARRAY ;OR SIMPLE VARIABLE IS ENCOUNTERED. ;SET TO [VARTAB] BY "CLEARC". FRETOP: BLOCK 2 ;TOP OF STRING FREE SPACE. FRESPC: BLOCK 2 ;POINTER TO NEW STRING. MEMSIZ: BLOCK 2 ;HIGHEST LOCATION IN MEMORY. ; --- LINE NUMBERS AND TEXTUAL POINTERS ---: CURLIN: BLOCK 2 ;CURRENT LINE #. ;SET TO 0,255 FOR DIRECT STATEMENTS. OLDLIN: BLOCK 2 ;OLD LINE NUMBER (SETUP BY ^C,"STOP" ;OR "END" IN A PROGRAM). POKER= LINNUM ;SET UP LOCATION USED BY POKE. ;TEMPORARY FOR INPUT AND READ CODE OLDTXT: BLOCK 2 ;OLD TEXT POINTER. ;POINTS AT STATEMENT TO BE EXEC'D NEXT. DATLIN: BLOCK 2 ;DATA LINE # -- REMEMBER FOR ERRORS. DATPTR: BLOCK 2 ;POINTER TO DATA. INITIALIZED TO POINT ;AT THE ZERO IN FRONT OF [TXTTAB] ;BY "RESTORE" WHICH IS CALLED BY "CLEARC". ;UPDATED BY EXECUTION OF A "READ". INPPTR: BLOCK 2 ;THIS REMEMBERS WHERE INPUT IS COMING FROM. ; --- STUFF USED IN EVALUATIONS ---: VARNAM: BLOCK 2 ;VARIABLE'S NAME IS STORED HERE. VARPNT: BLOCK 2 ;POINTER TO VARIABLE IN MEMORY. FDECPT= VARPNT ;POINTER INTO POWER OF TENS OF "FOUT". FORPNT: BLOCK 2 ;A VARIABLE'S POINTER FOR "FOR" LOOPS ;AND "LET" STATEMENTS. LSTPNT= FORPNT ;PNTR TO LIST STRING. ANDMSK= FORPNT ;THE MASK USED BY WAIT FOR ANDING. EORMSK= FORPNT+1 ;THE MASK FOR EORING IN WAIT. OPPTR: BLOCK 2 ;POINTER TO CURRENT OP'S ENTRY IN "OPTAB". VARTXT= OPPTR ;POINTER INTO LIST OF VARIABLES. OPMASK: BLOCK 1 ;MASK CREATED BY CURRENT OPERATOR. DOMASK=TANSGN ;MASK IN USE BY RELATION OPERATIONS. DEFPNT: BLOCK 2 ;POINTER USED IN FUNCTION DEFINITION. GRBPNT= DEFPNT ;ANOTHER USED IN GARBAGE COLLECTION. DSCPNT: BLOCK 2 ;POINTER TO A STRING DESCRIPTOR. IFN ADDPRC,<BLOCK 1> ;FOR TEMPF3. FOUR6: EXP STRSIZ ;VARIABLE CONSTANT USED BY GARB COLLECT. ; --- ET CETERA ---: JMPER: JMP 60000 SIZE= JMPER+1 OLDOV= JMPER+2 ;THE OLD OVERFLOW. TEMPF3= DEFPNT ;A THIRD FAC TEMPORARY (4 BYTES). TEMPF1: IFN ADDPRC,<0> ;FOR TEMPF1S EXTRA BYTE. HIGHDS: BLOCK 2 ;DESINATION OF HIGHEST ELEMENT IN BLT. HIGHTR: BLOCK 2 ;SOURCE OF HIGHEST ELEMENT TO MOVE. TEMPF2: IFN ADDPRC,<0> ;FOR TEMPF2S EXTRA BYTE. LOWDS: BLOCK 2 ;LOCATION OF LAST BYTE TRANSFERRED INTO. LOWTR: BLOCK 2 ;LAST THING TO MOVE IN BLT. ARYPNT= HIGHDS ;A POINTER USED IN ARRAY BUILDING. GRBTOP= LOWTR ;A POINTER USED IN GARBAGE COLLECTION. DECCNT= LOWDS ;NUMBER OF PLACES BEFORE DECIMAL POINT. TENEXP= LOWDS+1 ;HAS A DPT BEEN INPUT? DPTFLG= LOWTR ;BASE TEN EXPONENT. EXPSGN= LOWTR+1 ;SIGN OF BASE TEN EXPONENT. ; --- THE FLOATING ACCUMULATOR ---: FAC: FACEXP: 0 FACHO: 0 ;MOST SIGNIFICANT BYTE OF MANTISSA. IFN ADDPRC,< FACMOH: 0> ;ONE MORE. FACMO: 0 ;MIDDLE ORDER OF MANTISSA. FACLO: 0 ;LEAST SIG BYTE OF MANTISSA. FACSGN: 0 ;SIGN OF FAC (0 OR -1) WHEN UNPACKED. SGNFLG: 0 ;SIGN OF FAC IS PRESERVED BERE BY "FIN". DEGREE= SGNFLG ;A COUNT USED BY POLYNOMIALS. DSCTMP= FAC ;THIS IS WHERE TEMP DESCS ARE BUILT. INDICE= FACMO ;INDICE IS SET UP HERE BY "QINT". BITS: 0 ;SOMETHING FOR "SHIFTR" TO USE. ; --- THE FLOATING ARGUMENT (UNPACKED) ---: ARGEXP: 0 ARGHO: 0 IFN ADDPRC,<ARGMOH: 0> ARGMO: 0 ARGLO: 0 ARGSGN: 0 ARISGN: 0 ;A SIGN REFLECTING THE RESULT. FACOV: 0 ;OVERFLOW BYTE OF THE FAC. STRNG1= ARISGN ;POINTER TO A STRING OR DESCRIPTOR. FBUFPT: BLOCK 2 ;POINTER INTO FBUFFR USED BY FOUT. BUFPTR= FBUFPT ;POINTER TO BUF USED BY "CRUNCH". STRNG2= FBUFPT ;POINTER TO STRING OR DESC. POLYPT= FBUFPT ;POINTER INTO POLYNOMIAL COEFFICIENTS. CURTOL= FBUFPT ;ABSOLUTE LINEAR INDEX IS FORMED HERE. PAGE SUBTTL RAM CODE. ; THIS CODE GETS CHANGED THROUGHOUT EXECUTION. ; IT IS MADE TO BE FAST THIS WAY. ; ALSO, [X] AND [Y] ARE NOT DISTURBED ; ; "CHRGET" USING [TXTPTR] AS THE CURRENT TEXT PNTR ; FETCHES A NEW CHARACTER INTO ACCA AFTER INCREMENTING [TXTPTR] ; AND SETS CONDITION CODES ACCORDING TO WHAT'S IN ACCA. ; NOT C= NUMERIC ("0" THRU "9") ; Z= ":" OR END-OF-LINE (A NULL) ; ; [ACCA] = NEW CHAR. ; [TXTPTR]=[TXTPTR]+1 ; ; THE FOLLOWING EXISTS IN ROM IF ROM EXISTS AND IS LOADED ; DOWN HERE BY INIT. OTHERWISE IT IS JUST LOADED INTO THIS ; RAM LIKE ALL THE REST OF RAM IS LOADED. ; CHRGET: INC CHRGET+7 ;INCREMENT THE WHOLE TXTPTR. BNE CHRGOT INC CHRGET+8 CHRGOT: LDA 60000 ;A LOAD WITH AN EXT ADDR. TXTPTR= CHRGOT+1 CMPI " " ;SKIP SPACES. BEQ CHRGET QNUM: CMPI ":" ;IS IT A ":"? BCS CHRRTS ;IT IS .GE. ":" SEC SBCI "0" ;ALL CHARS .GT. "9" HAVE RET'D SO SEC SBCI 256-"0" ;SEE IF NUMERIC. ;TURN CARRY ON IF NUMERIC. ;ALSO, SETZ IF NULL. CHRRTS: RTS ;RETURN TO CALLER. RNDX: 128 ;LOADED OR FROM ROM. 79 ;THE INITIAL RANDOM NUMBER. 199 82 IFN ADDPRC,<89> ;ONE MORE BYTE. ORG 255 ;PAGE 1 STUFF COMING UP. LOFBUF: BLOCK 1 ;THE LOW FAC BUFFER. COPYABLE. ;--- PAGE ZERO/ONE BOUNDARY ---. ;MUST HAVE 13 CONTIGUOUS BYTES. FBUFFR: BLOCK 3ADDPRC+13 ;BUFFER FOR "FOUT". ;ON PAGE 1 SO THAT STRING IS NOT COPIED. ;STACK IS LOCATED HERE. IE FROM THE END OF FBUFFR TO STKEND. PAGE SUBTTL DISPATCH TABLES, RESERVED WORDS, AND ERROR TEXTS. ORG ROMLOC STMDSP: ADR(END-1) ADR(FOR-1) ADR(NEXT-1) ADR(DATA-1) IFN EXTIO,< ADR(INPUTN-1)> ADR(INPUT-1) ADR(DIM-1) ADR(READ-1) ADR(LET-1) ADR(GOTO-1) ADR(RUN-1) ADR(IF-1) ADR(RESTORE-1) ADR(GOSUB-1) ADR(RETURN-1) ADR(REM-1) ADR(STOP-1) ADR(ONGOTO-1) IFN NULCMD,< ADR(NULL-1)> ADR(FNWAIT-1) IFN DISKO,< IFE REALIO-3,< ADR(CQLOAD-1) ADR(CQSAVE-1) ADR(CQVERF-1)> IFN REALIO,< IFN REALIO-2,< IFN REALIO-3,< IFN REALIO-5,< ADR(LOAD-1) ADR(SAVE-1)>>>> IFN REALIO-1,< IFN REALIO-3,< IFN REALIO-4,< ADR(511) ;ADDRESS OF LOAD ADR(511)>>>> ;ADDRESS OF SAVE ADR(DEF-1) ADR(POKE-1) IFN EXTIO,< ADR(PRINTN-1)> ADR(PRINT-1) ADR(CONT-1) IFE REALIO,< ADR(DDT-1)> ADR(LIST-1) ADR(CLEAR-1) IFN EXTIO,< ADR(CMD-1) ADR(CQSYS-1) ADR(CQOPEN-1) ADR(CQCLOS-1)> IFN GETCMD,< ADR(GET-1)> ;FILL W/ GET ADDR. ADR(SCRATH-1) FUNDSP: ADR(SGN) ADR(INT) ADR(ABS) IFE ROMSW,< USRLOC: ADR(FCERR)> ;INITIALLY NO USER ROUTINE. IFN ROMSW,< USRLOC: ADR(USRPOK)> ADR(FRE) ADR(POS) ADR(SQR) ADR(RND) ADR(LOG) ADR(EXP) IFN KIMROM,< REPEAT 4,< ADR(FCERR)>> IFE KIMROM,< COSFIX: ADR(COS) SINFIX: ADR(SIN) TANFIX: ADR(TAN) ATNFIX: ADR(ATN)> ADR(PEEK) ADR(LEN) ADR(STR) ADR(VAL) ADR(ASC) ADR(CHR) ADR(LEFT) ADR(RIGHT) ADR(MID) OPTAB: 121 ADR(FADDT-1) 121 ADR(FSUBT-1) 123 ADR(FMULTT-1) 123 ADR(FDIVT-1) 127 ADR(FPWRT-1) 80 ADR(ANDOP-1) 70 ADR(OROP-1) NEGTAB: 125 ADR(NEGOP-1) NOTTAB: 90 ADR(NOTOP-1) PTDORL: 100 ;PRECEDENCE. ADR (DOREL-1) ;OPERATOR ADDRESS. ; ; TOKENS FOR RESERVED WORDS ALWAYS HAVE THE MOST ; SIGNIFICANT BIT ON. ; THE LIST OF RESERVED WORDS: ; Q=128-1 DEFINE DCI(A),<Q=Q+1 DC(A)> RESLST: DCI"END" ENDTK==Q DCI"FOR" FORTK==Q DCI"NEXT" DCI"DATA" DATATK==Q IFN EXTIO,< DCI"INPUT#"> DCI"INPUT" DCI"DIM" DCI"READ" DCI"LET" DCI"GOTO" GOTOTK==Q DCI"RUN" DCI"IF" DCI"RESTORE" DCI"GOSUB" GOSUTK=Q DCI"RETURN" DCI"REM" REMTK=Q DCI"STOP" DCI"ON" IFN NULCMD,< DCI"NULL"> DCI"WAIT" IFN DISKO,< DCI"LOAD" DCI"SAVE" IFE REALIO-3,< DCI"VERIFY">> DCI"DEF" DCI"POKE" IFN EXTIO,< DCI"PRINT#"> DCI"PRINT" PRINTK==Q DCI"CONT" IFE REALIO,< DCI"DDT"> DCI"LIST" IFN REALIO-3,< DCI"CLEAR"> IFE REALIO-3,< DCI"CLR"> IFN EXTIO,< DCI"CMD" DCI"SYS" DCI"OPEN" DCI"CLOSE"> IFN GETCMD,< DCI"GET"> DCI"NEW" SCRATK=Q ; END OF COMMAND LIST. "T" "A" "B" "("+128 Q=Q+1 TABTK=Q DCI"TO" TOTK==Q DCI"FN" FNTK==Q "S" "P" "C" "("+128 ;MACRO DOESNT LIKE ('S IN ARGUMENTS. Q=Q+1 SPCTK==Q DCI"THEN" THENTK=Q DCI"NOT" NOTTK==Q DCI"STEP" STEPTK=Q DCI"+" PLUSTK=Q DCI"-" MINUTK=Q DCI"" DCI"/" DCI"^" DCI"AND" DCI"OR" 190 ;A GREATER THAN SIGN Q=Q+1 GREATK=Q DCI"=" EQULTK=Q 188 Q=Q+1 ;A LESS THAN SIGN LESSTK=Q ; ; NOTE DANGER OF ONE RESERVED WORD BEING A PART ; OF ANOTHER: ; IE . . IF 2 GREATER THAN F OR T=5 THEN... ; WILL NOT WORK!!! SINCE "FOR" WILL BE CRUNCHED!! ; IN ANY CASE MAKE SURE THE SMALLER WORD APPEARS ; SECOND IN THE RESERVED WORD TABLE ("INP" AND "INPUT") ; ANOTHER EXAMPLE: IF T OR Q THEN ... "TO" IS CRUNCHED ; DCI"SGN" ONEFUN=Q DCI"INT" DCI"ABS" DCI"USR" DCI"FRE" DCI"POS" DCI"SQR" DCI"RND" DCI"LOG" DCI"EXP" DCI"COS" DCI"SIN" DCI"TAN" DCI"ATN" DCI"PEEK" DCI"LEN" DCI"STR$" DCI"VAL" DCI"ASC" DCI"CHR$" LASNUM==Q ;NUMBER OF LAST FUNCTION ;THAT TAKES ONE ARG DCI"LEFT$" DCI"RIGHT$" DCI"MID$" DCI"GO" GOTK==Q 0 ;MARKS END OF RESERVED WORD LIST IFE LNGERR,< Q=0-2 DEFINE DCE(X),<Q=Q+2 DC(X)> ERRTAB: DCE"NF" ERRNF==Q ;NEXT WITHOUT FOR. DCE"SN" ERRSN==Q ;SYNTAX DCE"RG" ERRRG==Q ;RETURN WITHOUT GOSUB. DCE"OD" ERROD==Q ;OUT OF DATA. DCE"FC" ERRFC==Q ;ILLEGAL QUANTITY. DCE"OV" ERROV==Q ;OVERFLOW. DCE"OM" ERROM==Q ;OUT OF MEMORY. DCE"US" ERRUS==Q ;UNDEFINED STATEMENT. DCE"BS" ERRBS==Q ;BAD SUBSCRIPT. DCE"DD" ERRDD==Q ;REDIMENSIONED ARRAY. DCE"/0" ERRDV0==Q ;DIVISION BY ZERO. DCE"ID" ERRID==Q ;ILLEGAL DIRECT. DCE"TM" ERRTM==Q ;TYPE MISMATCH. DCE"LS" ERRLS==Q ;STRING TOO LONG. IFN EXTIO,< DCE"FD" ;FILE DATA. ERRBD==Q> DCE"ST" ERRST==Q ;STRING FORMULA TOO COMPLEX. DCE"CN" ERRCN==Q ;CAN'T CONTINUE. DCE"UF" ERRUF==Q> ;UNDEFINED FUNCTION. IFN LNGERR,< Q=0 ; NOTE: THIS ERROR COUNT TECHNIQUE WILL NOT WORK IF THERE ARE MORE ; THAN 256 CHARACTERS OF ERROR MESSAGES ERRTAB: DC"NEXT WITHOUT FOR" ERRNF==Q Q=Q+16 DC"SYNTAX" ERRSN==Q Q=Q+6 DC"RETURN WITHOUT GOSUB" ERRRG==Q Q=Q+20 DC"OUT OF DATA" ERROD==Q Q=Q+11 DC"ILLEGAL QUANTITY" ERRFC==Q Q=Q+16 DC"OVERFLOW" ERROV==Q Q=Q+8 DC"OUT OF MEMORY" ERROM==Q Q=Q+13 DC"UNDEF'D STATEMENT" ERRUS==Q Q=Q+17 DC"BAD SUBSCRIPT" ERRBS==Q Q=Q+13 DC"REDIM'D ARRAY" ERRDD==Q Q=Q+13 DC"DIVISION BY ZERO" ERRDV0==Q Q=Q+16 DC"ILLEGAL DIRECT" ERRID==Q Q=Q+14 DC"TYPE MISMATCH" ERRTM==Q Q=Q+13 DC"STRING TOO LONG" ERRLS==Q Q=Q+15 IFN EXTIO,< DC"FILE DATA" ERRBD==Q Q=Q+9> DC"FORMULA TOO COMPLEX" ERRST==Q Q=Q+19 DC"CAN'T CONTINUE" ERRCN==Q Q=Q+14 DC"UNDEF'D FUNCTION" ERRUF==Q> ; ; NEEDED FOR MESSAGES IN ALL VERSIONS. ; ERR: DT" ERROR" 0 INTXT: DT" IN " 0 REDDY: ACRLF IFE REALIO-3,< DT"READY."> IFN REALIO-3,< DT"OK"> ACRLF 0 BRKTXT: ACRLF DT"BREAK" 0 PAGE SUBTTL GENERAL STORAGE MANAGEMENT ROUTINES. ; ; FIND A "FOR" ENTRY ON THE STACK VIA "VARPNT". ; FORSIZ==2ADDPRC+16 FNDFOR: TSX ;LOAD XREG WITH STK PNTR. REPEAT 4,<INX> ;IGNORE ADR(NEWSTT) AND RTS ADDR. FFLOOP: LDA 257,X ;GET STACK ENTRY. CMPI FORTK ;IS IT A "FOR" TOKEN? BNE FFRTS ;NO, NO "FOR" LOOPS WITH THIS PNTR. LDA FORPNT+1 ;GET HIGH. BNE CMPFOR LDA 258,X ;PNTR IS ZERO, SO ASSUME THIS ONE. STA FORPNT LDA 259,X STA FORPNT+1 CMPFOR: CMP 259,X BNE ADDFRS ;NOT THIS ONE. LDA FORPNT ;GET DOWN. CMP 258,X BEQ FFRTS ;WE GOT IT! WE GOT IT! ADDFRS: TXA CLC ;ADD 16 TO X. ADCI FORSIZ TAX ;RESULT BACK INTO X. BNE FFLOOP FFRTS: RTS ;RETURN TO CALLER. ; ; THIS IS THE BLOCK TRANSFER ROUTINE. ; IT MAKES SPACE BY SHOVING EVERYTHING FORWARD. ; ; ON ENTRY: ; [Y,A]=[HIGHDS] (FOR REASON). ; [HIGHDS]= DESTINATION OF [HIGH ADDRESS]. ; [LOWTR]= LOWEST ADDR TO BE TRANSFERRED. ; [HIGHTR]= HIGHEST ADDR TO BE TRANSFERRED. ; ; A CHECK IS MADE TO ASCERTAIN THAT A REASONABLE ; AMOUNT OF SPACE REMAINS BETWEEN THE BOTTOM ; OF THE STRINGS AND THE HIGHEST LOCATION TRANSFERRED INTO. ; ; ON EXIT: ; [LOWTR] ARE UNCHANGED. ; [HIGHTR]=[LOWTR]-200 OCTAL. ; [HIGHDS]=LOWEST ADDR TRANSFERRED INTO MINUS 200 OCTAL. ; BLTU: JSR REASON ;ASCERTAIN THAT STRING SPACE WON'T ;BE OVERRUN. STWD STREND BLTUC: SEC ;PREPARE TO SUBTRACT. LDA HIGHTR SBC LOWTR ;COMPUTE NUMBER OF THINGS TO MOVE. STA INDEX ;SAVE FOR LATER. TAY LDA HIGHTR+1 SBC LOWTR+1 TAX ;PUT IT IN A COUNTER REGISTER. INX ;SO THAT COUNTER ALGORITHM WORKS. TYA ;SEE IF LOW PART OF COUNT IS ZERO. BEQ DECBLT ;YES, GO START MOVING BLOCKS. LDA HIGHTR ;NO, MUST MODIFY BASE ADDR. SEC SBC INDEX ;BORROW IS OFF SINCE [HIGHTR].GT.[LOWTR]. STA HIGHTR ;SAVE MODIFIED BASE ADDR. BCS BLT1 ;IF NO BORROW, GO SHOVE IT. DEC HIGHTR+1 ;BORROW IMPLIES SUB 1 FROM HIGH ORDER. SEC BLT1: LDA HIGHDS ;MOD BASE OF DEST ADDR. SBC INDEX STA HIGHDS BCS MOREN1 ;NO BORROW. DEC HIGHDS+1 ;DECREMENT HIGH ORDER BYTE. BCC MOREN1 ;ALWAYS SKIP. BLTLP: LDADY HIGHTR ;FETCH BYTE TO MOVE STADY HIGHDS ;MOVE IT IN, MOVE IT OUT. MOREN1: DEY BNE BLTLP LDADY HIGHTR ;MOVE LAST OF THE BLOCK. STADY HIGHDS DECBLT: DEC HIGHTR+1 DEC HIGHDS+1 ;START ON NEW BLOCKS. DEX BNE MOREN1 RTS ;RETURN TO CALLER. ; ; THIS ROUTINE IS USED TO ASCERTAIN THAT A GIVEN ; NUMBER OF LOCS REMAIN AVAILABLE FOR THE STACK. ; THE CALL IS: ; LDAI NUMBER OF 2-BYTE ENTRIES NEEDED. ; JSR GETSTK ; ; THIS ROUTINE MUST BE CALLED BY ANY ROUTINE WHICH PUTS ; AN ARBITRARY AMOUNT OF STUFF ON THE STACK, ; I.E., ANY RECURSIVE ROUTINE LIKE "FRMEVL". ; IT IS ALSO CALLED BY ROUTINES SUCH AS "GOSUB" AND "FOR" ; WHICH MAKE PERMANENT ENTRIES ON THE STACK. ; ; ROUTINES WHICH MERELY USE AND FREE UP THE GUARANTEED ; NUMLEV LOCATIONS NEED NOT CALL THIS. ; ; ; ON EXIT: ; [A] AND [X] HAVE BEEN MODIFIED. ; GETSTK: ASL A, ;MULT [A] BY 2. NB, CLEARS C BIT. ADCI 2NUMLEV+<3ADDPRC>+13 ;MAKE SURE 2NUMLEV+13 LOCS ;(13 BECAUSE OF FBUFFR) BCS OMERR ;WILL REMAIN IN STACK. STA INDEX TSX ;GET STACKED. CPX INDEX ;COMPARE. BCC OMERR ;IF STACK.LE.INDEX1, OM. RTS ; ; [Y,A] IS A CERTAIN ADDRESS. "REASON" MAKES SURE ; IT IS LESS THAN [FRETOP]. ; REASON: CPY FRETOP+1 BCC REARTS BNE TRYMOR ;GO GARB COLLECT. CMP FRETOP BCC REARTS TRYMOR: PHA LDXI 8+ADDPRC ;IF TEMPF2 HAS ZERO IN BETWEEN. TYA REASAV: PHA LDA HIGHDS-1,X ;SAVE HIGHDS ON STACK. DEX BPL REASAV ;PUT 8 OF THEM ON STK. JSR GARBA2 ;GO GARB COLLECT. LDXI 256-8-ADDPRC REASTO: PLA STA HIGHDS+8+ADDPRC,X ;RESTORE AFTER GARB COLLECT. INX BMI REASTO PLA TAY PLA ;RESTORE A AND Y. CPY FRETOP+1 ;COMPARE HIGHS BCC REARTS BNE OMERR ;HIGHER IS BAD. CMP FRETOP ;AND THE LOWS. BCS OMERR REARTS: RTS PAGE SUBTTL ERROR HANDLER, READY, TERMINAL INPUT, COMPACTIFY, NEW, REINIT. OMERR: LDXI ERROM ERROR: IFN REALIO,< LSR CNTWFL> ;FORCE OUTPUT. IFN EXTIO,< LDA CHANNL ;CLOSE NON-TERMINAL CHANNEL. BEQ ERRCRD JSR CQCCHN ;CLOSE IT. LDAI 0 STA CHANNL> ERRCRD: JSR CRDO ;OUTPUT CRLF. JSR OUTQST ;PRINT A QUESTION MARK IFE LNGERR,< LDA ERRTAB,X, ;GET FIRST CHR OF ERR MSG. JSR OUTDO ;OUTPUT IT. LDA ERRTAB+1,X, ;GET SECOND CHR. JSR OUTDO> ;OUTPUT IT. IFN LNGERR,< GETERR: LDA ERRTAB,X PHA ANDI 127 ;GET RID OF HIGH BIT. JSR OUTDO ;OUTPUT IT. INX PLA ;LAST CHAR OF MESSAGE? BPL GETERR> ;NO. GO GET NEXT AND OUTPUT IT. TYPERR: JSR STKINI ;RESET THE STACK AND FLAGS. LDWDI ERR ;GET PNTR TO " ERROR". ERRFIN: JSR STROUT ;OUTPUT IT. LDY CURLIN+1 INY ;WAS NUMBER 64000? BEQ READY ;YES, DON'T TYPE LINE NUMBER. JSR INPRT READY: IFN REALIO,< LSR CNTWFL> ;TURN OUTPUT BACK ON IF SUPRESSED LDWDI REDDY ;SAY "OK". IFN REALIO-3,< JSR RDYJSR> ;OR GO TO INIT IF INIT ERROR. IFE REALIO-3,< JSR STROUT> ;NO INIT ERRORS POSSIBLE. MAIN: JSR INLIN ;GET A LINE FROM TERMINAL. STXY TXTPTR JSR CHRGET TAX ;SET ZERO FLAG BASED ON [A] ;THIS DISTINGUISHES ":" AND 0 BEQ MAIN ;IF BLANK LINE, GET ANOTHER. LDXI 255 ;SET DIRECT LINE NUMBER. STX CURLIN+1 BCC MAIN1 ;IS A LINE NUMBER. NOT DIRECT. JSR CRUNCH ;COMPACTIFY. JMP GONE ;EXECUTE IT. MAIN1: JSR LINGET ;READ LINE NUMBER INTO "LINNUM". JSR CRUNCH STY COUNT ;RETAIN CHARACTER COUNT. JSR FNDLIN BCC NODEL ;NO MATCH, SO DON'T DELETE. LDYI 1 LDADY LOWTR STA INDEX1+1 LDA VARTAB STA INDEX1 LDA LOWTR+1 ;SET TRANSFER TO. STA INDEX2+1 LDA LOWTR DEY SBCDY LOWTR ;COMPUTE NEGATIVE LENGTH. CLC ADC VARTAB ;COMPUTE NEW VARTAB. STA VARTAB STA INDEX2 ;SET LOW OF TRANS TO. LDA VARTAB+1 ADCI 255 STA VARTAB+1 ;COMPUTE HIGH OF VARTAB. SBC LOWTR+1 ;COMPUTE NUMBER OF BLOCKS TO MOVE. TAX SEC LDA LOWTR SBC VARTAB ;COMPUTE OFFSET. TAY BCS QDECT1 ;IF VARTAB.LE.LOWTR, INX ;DECR DUE TO CARRY, AND DEC INDEX2+1 ;DECREMENT STORE SO CARRY WORKS. QDECT1: CLC ADC INDEX1 BCC MLOOP DEC INDEX1+1 CLC ;FOR LATER ADCQ MLOOP: LDADY INDEX1 STADY INDEX2 INY BNE MLOOP ;BLOCK DONE? INC INDEX1+1 INC INDEX2+1 DEX BNE MLOOP ;DO ANOTHER BLOCK. ALWAYS. NODEL: JSR RUNC ;RESET ALL VARIABLE INFO SO GARBAGE ;COLLECTION CAUSED BY REASON WILL WORK JSR LNKPRG ;FIX UP THE LINKS LDA BUF ;SEE IF ANYTHNG THERE BEQ MAIN CLC LDA VARTAB STA HIGHTR ;SETUP HIGHTR. ADC COUNT ;ADD LENGTH OF LINE TO INSERT. STA HIGHDS ;THIS GIVES DEST ADDR. LDY VARTAB+1 STY HIGHTR+1 ;SAME FOR HIGH ORDERS. BCC NODELC INY NODELC: STY HIGHDS+1 JSR BLTU IFN BUFPAG,< LDWD LINNUM ;POSITION THE BINARY LINE NUMBER STWD BUF-2> ;IN FRONT OF BUF LDWD STREND STWD VARTAB LDY COUNT DEY STOLOP: LDA BUF-4,Y STADY LOWTR DEY BPL STOLOP FINI: JSR RUNC ;DO CLEAR & SET UP STACK. ;AND SET [TXTPTR] TO [TXTTAB]-1. JSR LNKPRG ;FIX UP PROGRAM LINKS JMP MAIN LNKPRG: LDWD TXTTAB ;SET [INDEX] TO [TXTTAB]. STWD INDEX CLC ; ; CHEAD GOES THROUGH PROGRAM STORAGE AND FIXES ; UP ALL THE LINKS. THE END OF EACH LINE IS FOUND ; BY SEARCHING FOR THE ZERO AT THE END. ; THE DOUBLE ZERO LINK IS USED TO DETECT THE END OF THE PROGRAM. ; CHEAD: LDYI 1 LDADY INDEX ;ARRIVED AT DOUBLE ZEROES? BEQ LNKRTS LDYI 4 CZLOOP: INY ;THERE IS AT LEAST ONE BYTE. LDADY INDEX BNE CZLOOP ;NO, CONTINUE SEARCHING. INY ;GO ONE BEYOND. TYA ADC INDEX TAX LDYI 0 STADY INDEX LDA INDEX+1 ADCI 0 INY STADY INDEX STX INDEX STA INDEX+1 BCCA CHEAD ;ALWAYS BRANCHES. LNKRTS: RTS ; ; THIS IS THE LINE INPUT ROUTINE. ; IT READS CHARACTERS INTO BUF USING BACKARROW (UNDERSCORE, OR ; SHIFT O) AS THE DELETE CHARACTER AND @ AS THE ; LINE DELETE CHARACTER. IF MORE THAN BUFLEN CHARACTERS ; ARE TYPED, NO ECHOING IS DONE UNTIL A BACKARROW OR @ OR CR ; IS TYPED. CONTROL-G WILL BE TYPED FOR EACH EXTRA CHARACTER. ; THE ROUTINE IS ENTERED AT INLIN. ; IFE REALIO-4,< INLIN: LDXI 128 ;NO PROMPT CHARACTER STX CQPRMP JSR CQINLN ;GET A LINE ONTO PAGE 2 CPXI BUFLEN-1 BCS GDBUFS ;NOT TOO MANY CHARACTERS LDXI BUFLEN-1 GDBUFS: LDAI 0 ;PUT A ZERO AT THE END STA BUF,X TXA BEQ NOCHR LOPBHT: LDA BUF-1,X ANDI 127 STA BUF-1,X DEX BNE LOPBHT NOCHR: LDAI 0 LDXYI <BUF-1> ;POINT AT THE BEGINNING RTS> IFN REALIO-4,< IFN REALIO-3,< LINLIN: IFE REALIO-2,< JSR OUTDO> ;ECHO IT. DEX ;BACKARROW SO BACKUP PNTR AND BPL INLINC ;GET ANOTHER IF COUNT IS POSITIVE. INLINN: IFE REALIO-2,< JSR OUTDO> ;PRINT THE @ OR A SECOND BACKARROW ;IF THERE WERE TOO MANY. JSR CRDO> INLIN: LDXI 0 INLINC: JSR INCHR ;GET A CHARACTER. IFN REALIO-3,< CMPI 7 ;IS IT BOB ALBRECHT RINGING THE BELL ;FOR SCHOOL KIDS? BEQ GOODCH> CMPI 13 ;CARRIAGE RETURN? BEQ FININ1 ;YES, FINISH UP. IFN REALIO-3,< CMPI 32 ;CHECK FOR FUNNY CHARACTERS. BCC INLINC CMPI 125 ;IS IT TILDA OR DELETE? BCS INLINC ;BIG BAD ONES TOO. CMPI "@" ;LINE DELETE? BEQ INLINN ;YES. CMPI "_" ;CHARACTER DELETE? BEQ LINLIN> ;YES. GOODCH: IFN REALIO-3,< CPXI BUFLEN-1 ;LEAVE ROOM FOR NULL. ;COMMO ASSURES US NEVER MORE THAN BUFLEN. BCS OUTBEL> STA BUF,X INX IFE REALIO-2,<SKIP2> IFN REALIO-2,<BNE INLINC> IFN REALIO-3,< OUTBEL: LDAI 7 IFN REALIO,< JSR OUTDO> ;ECHO IT. BNE INLINC> ;CYCLE ALWAYS. FININ1: JMP FININL> ;GO TO FININL FAR, FAR AWAY. INCHR: IFE REALIO-3,< JSR CQINCH> ;FOR COMMODORE. IFE REALIO-2,< INCHRL: LDA ^O176000 REPEAT 4,<NOP> LSR A, BCC INCHRL LDA ^O176001 ;GET THE CHARACTER. REPEAT 4,<NOP> ANDI 127> IFE REALIO-1,< JSR ^O17132> ;1E5A FOR MOS TECH. IFE REALIO-4,< JSR CQINCH ;FD0C FOR APPLE COMPUTER. ANDI 127> IFE REALIO,< TJSR INSIM##> ;GET A CHARACTER FROM SIMULATOR IFN REALIO,< IFN EXTIO,< LDY CHANNL ;CNT-O HAS NO EFFECT IF NOT FROM TERM. BNE INCRTS> CMPI CONTW ;SUPPRESS OUTPUT CHARACTER (^W). BNE INCRTS ;NO, RETURN. PHA COM CNTWFL ;COMPLEMENT ITS STATE. PLA> INCRTS: RTS ;END OF INCHR. ; ; ALL "RESERVED" WORDS ARE TRANSLATED INTO SINGLE ; BYTES WITH THE MSB ON. THIS SAVES SPACE AND TIME ; BY ALLOWING FOR TABLE DISPATCH DURING EXECUTION. ; THEREFORE ALL STATEMENTS APPEAR TOGETHER IN THE ; RESERVED WORD LIST IN THE SAME ORDER THEY ; APPEAR IN STMDSP. ; BUFOFS=0 ;THE AMOUNT TO OFFSET THE LOW BYTE ;OF THE TEXT POINTER TO GET TO BUF ;AFTER TXTPTR HAS BEE
6 0 2643天前
admin
5633
对自己落井下石的人 新浪微博宋涵 @ 2015-01-13 ★ 8064 人为什么难以获得持久的幸福?除了在欲求不足的痛苦和满足后的无聊间摇摆之外,他们还几乎不懂得珍惜自己,而总是热衷于对自己落井下石——受到伤害以后,许多人最本能的反应不是安慰和爱抚自己,而是和那些伤害自己的势力一起,责备、嘲笑、看轻自己,甚至再一次践踏自己,这就是人心常常做的事。 1 人为什么难以获得持久的幸福?叔本华认为是人的本性使然:“生命是一团欲望,欲望不能满足便痛苦,满足便无聊,人生就在痛苦和无聊之间摇摆。” 这句话的魔力在于,你盯着它看很多遍,还是找不到可供反驳的漏洞。这么普通的牢笼,我们竟然就是逃脱不了。看来只有能克服这种天然本性的人,才能比大多数人获得更长久一点的幸福。 所以,人心是多么矛盾的东西啊,既不顾一切地追求快乐,又不由自主跳到沼泽之中,像一个滑稽的小丑,竭尽全力还是停止不前;而它自己还意识不到,还以为在追寻快乐的大道上一往无前。 然而,阻碍人们获得幸福的本性还不止这一点,如果我们花一点时间,跳出我们习以为常的世界——对,有个好方法是想象自己是外星人,第一次来到地球上,第一次观察到人类(你不妨试一试),就会发现人类行为的另一个奇特之处:他们几乎不懂得珍惜自己,而总是热衷于对自己落井下石,这种狂热甚至到了令一个外星生物心惊肉跳的地步。 对自己落井下石的人Give Yourself a Bear Hug, by Lim Heng Swee. 2 为什么这么说呢?请耐心一点,我会将“外星人”看到的现象一一道来: 降落到地球上的生命,是幸运的,因为这是一个温暖、壮美、丰富、有趣的星球;同时也充满着不幸的可能,因为这个星球上无时不刻在上演淘汰、灾难和毁灭。至于人类社会,就更复杂了,他们有精巧的文明,也有厚重的愚昧和满满的恶意。 一个人从出生到地球上的那一刻起,就身处这样既有好又有坏的环境中。人是如此脆弱,如此容易受到“坏”的伤害。活着的人,总会有些伤害在等待他们:严重的,被人杀害、虐待或羞辱,普通的,被人漠视、嘲弄或误解;看得见的,是淤青流血的肉体,看不见的,是崩溃破碎的灵魂。人不仅要面对大自然的变化无常,还有身边人举着那愚钝粗糙的大锯子、有意或无意切割自己的伤害与痛苦。 任何一个心怀正义和悲悯的人(哪怕是一个“外星人”),看到这样受苦的现象,都会忍不住同情那无辜的受害者,如果有条件,还会给予一点慰藉和一点帮助。 可是,当人自己受到伤害以后,最本能的反应不是安慰和爱抚自己,而是和那些伤害自己的势力一起,责备、嘲笑、看轻自己,甚至再一次践踏自己,这不是太奇怪了吗?可这就是人心常常做的事。 3 不信吗?你去看那些自卑的、佝偻着精神脊椎的人,那些胆怯的、躲避着幸福的人,那些绝望的、放弃任何努力的人,都是源自于他们在毫无反抗力的时候,受到了世界的恶意与伤害。 因为被人不断地说:“你丑得像个怪胎”、“怎么会有你这么笨的小孩”、“为什么要把你生出来”,人就会相信这些话,相信自己是毫无价值的,他/她就再不敢奢望幸福。 因为被人打骂、侮辱、遗弃,人在短暂的愤怒之后,就会怀疑自己活着的意义,“不值得活下去”的念头就会像幽灵一样总是缠着他/她; 哪怕因为最普通的求爱失败、或者错爱了一个人,就怀疑再也不会有人爱自己,于是扔掉仅有的勇气,再不去追寻;或者相信自己只能配得上坏人,心甘情愿地依附着伤害自己的人。——这些都是人心常常做的事啊。 4 这种行为是什么呢?就是在跌落井底之后,人不会拍掉身上的污浊,也不会包扎疼痛的伤口,更不会锻炼力气重回光明之地,而是下意识地搬起石头,狠狠砸自己的腿,让自己再也走不出这样的境地。 人在不知不觉中,也成为了加害者的同盟。 5 伤害发生过后,人对自己的“落井下石”,是如此快速、隐蔽而强大的本能反应,以至于本该有的理解、安慰、鼓励都毫无立足之地。 作为一个外星人,你会看到,人是一个悲哀的物种,因为他们的基因密码里,没有“自爱”的默认设置,他们好像天生就不会自爱。 他们的自爱,都来源于他人的爱,只有被真爱包围时,他们内心的“自爱”才会苏醒和启动。 如果遇到伤害,他们的认知系统,就会自动认同伤害传递的信息,形成顽强的暗示,化为第二次更旷日持久的伤害。 当别人说他/她丑,他/她就要用尽一切办法证明自己不丑;当父母忽视他/她,他/她就要拼命成为一个耀眼的人,要被父母看见和重视;当整个世界都曾苛刻地对待过他/她,他/她就会用玩世不恭的桀骜态度来表达无法爱上任何一个人的绝望。在这一切的“努力”深处,藏着惶恐和恐惧,正是他们在认同那些声音:“你就是丑”、“你就是个失败者”、“你就是没人爱”。给自己一个温柔的拥抱,肯定自己的存在,竟是这么难。 对自己落井下石的人 6 外星人会感叹,这是一个多么悲哀的循环:“自爱”要有“他爱”才能启动,可是,没有“自爱”的人又无法给予“他爱”,那么他/她身边的人,也无法启动“自爱”。 等等,外星人不要急着离开。我们再重新审问一下这个论断:人的基因密码里,真的没有“自爱”的默认设置吗? 如果没有,那么最初的、来自他人的“爱”是怎么来的?真的是来自“上帝”吗?假若真的是“上帝”的爱启动了人类的爱,那么每一个个体的内心中不正是有了“自爱”的种子? 看来之前的结论是太武断了。聪明的外星人得修正一下,“自爱”只是习惯沉睡而已,在许多人的一生中很少发挥作用,但也有罕见的案例:无论受到怎样的伤害,这些人永远是自己的支持者;他们绝不对自己落井下石。 曾经有大学生被拍到全裸洗澡的照片,受不了舆论的压力而跳楼自杀;但是,也有一个叫珍妮弗·劳伦斯的女人,在卷入“艳照门”事件后,选择为自己撑腰,对着全世界的恶意大声说:“我不知道我有什么好道歉的。”从外星人的角度看,珍妮弗·劳伦斯的做法明显更合理;为了他人的恶意而惩罚自己,不是不可理喻吗?但从人类的历史来看,珍妮弗·劳伦斯反而是个奇葩。 对自己落井下石的人 还有一个叫奥普拉·温弗瑞的女人,从小就被虐待和性侵,14岁就生下了第一个孩子,可是她没有像大多数人那样,被伤害所毁灭,她只需要简单地告诉自己一件事:“这些都不是我的错”,就能一步一步接近她想要的正常生活。 如果你仔细辨认,你一定能在茫茫人海中认出这些人。 这些人被称为“坚强”或“英雄”,可是他们只是懂得温柔地爱自己而已。他们就是坚定一个信念:即使全世界都不爱你(事实上,全世界都不爱你,这只是某一种绝望境地中的狭隘错觉),你总有一个坚定的拥护者:你自己。 神奇的事情是,当一个人在无论如何的情况下,都能突破恐惧与绝望,去珍惜自己时,残酷的世界也会呈现出温柔的一面。 7 “不爱自己”是人类的死穴,虽然一部分人整天嚷着要“爱别人”,还有一部分有觉醒的人呼吁要“爱自己”,然而真正做到能爱自己的,非常罕见。我们总是不自觉地,在伤害我们的外在势力上,补上最关键的一刀。 爱自己,是知行合一,这个难度级别估计仅次于克服叔本华的“钟摆定律”。 无论如何,活着就是要活得更智慧和更幸福。我们无法完全克服本能,但我们可以在本能冲动之前,留一点迟疑和观察。世界辽阔无常,有些路总要一个人走,在这条路上,我们可以尽量去做:少一点对自己“落井下石”,多给自己一点理解的拥抱。■
5 0 2678天前
admin
4756
作者:枫林秋水  有的时候,人生就像一本书,阅尽繁华,读懂了光阴,读懂了岁月,读懂了别人,而最难得的却是能够读懂自己。从打开泛黄的扉页,到认真读懂每一段文字,正如依着生命的阳光,褪尽铅华,在简洁明净的开始中,重新审视那个原来的自己。    时间能让世间所有的一切回到最初的淡然。或许也只有在那份自然的平静中,才能得到以前从未有过的安宁。无论任何一种经历,当你再次回味的时候,都只是你生命里曾经有过的斑斓。    人生的路上,简单而行,将流年的馨香,在岁月的幽静中,珍藏一朵春天的明媚;尘间的厚重,婉约而过,在心如止水的平静里,将时光的优雅,珍惜那份最初的留白。    尘缘的因果间,也许会得不到自己想要的结果,但你所得到的,一定是为当初无悔的选择而一笑释然。岁月的沧桑,除了风雨的薄凉,也在世事无常的冷暖中,学会了用一个浅浅的微笑,静待下一个路口的阳光。    繁华如烟,时光匆匆而过,岁月的洗涤,让一份清浅的简单,依着一颗清净的心,在光阴的沉静中,相依而伴。渐渐的,不再留恋虚空的东西,只喜欢将那些寻常之物,或握在掌间,或回味于心中。年华越深,奢望也越来越少,简单的一餐饭,一杯清水,便是人间最暖的烟火。    对于那些不完整的记忆中,拼凑出来的陌路,在坦然的会心一笑中,便轻轻而过。岁月给予的不止是烦恼与悲伤,而更多的是转身过后,看到的那满树花开的绚烂。    人生的精彩,总是从繁华和喧嚣中走到沉寂和落寞。不要让满满的浮华,沉重你本可轻松的行程。适时的给自己留一半清欢,留一半寂寞,让一份从容,在时光如水的韵律中,邂逅那个素静、自然的安宁。    不管是风,还是雨,一直在纷飞的落花中寻找流年的影,却终于在一程墨色里,落下一笺凝望的目光。也许这世上除了生命,似乎就是关于灵魂的超乎凡尘的所有,而这些笔墨之中飞出的光景,依然将岁月的浅静,流落出一份平和的安详。    世间本无相,皆是万般缘。红尘浮华,纷扰在心。尘间最悲伤的,莫过于,我来,你却已经离开。世间最难解的就是一个情字,不能相守的,唯有放下,才能让曾经有过的时光,在岁月的弥久中,生出一份淡然的暗香。    滚滚红尘,静静的相守在情梦的边缘,无需言语,一份懂得,便是驻留内心的真情。一次相逢,几许柔情,几许风雨,种下一颗清欢的念,开出一份内心的无悔。云水之间,那叶划向彼岸的轻舟,已然在潮起潮落中,载满相思的流年。    岁月的深沉,让夏天的草木也随着深了。而时光终是与我一念温柔。经年的沉香里,莫若把沧桑交给岁月遗忘。那些共同走过的时光里,依然在素心萦绕着的暖里,轻守着平淡的安然。    光阴的清茶,岁月的陈酒,或是一首老歌,久了,到最后无不都是平淡的味道。风尘之中,只想做一个素心若禅之人,携一份清浅,在简单的平静中,轻守自己心中的风景。    老旧的年华里,执笔落下一段无悔的青春,青涩的时光,亦是最美的年华里开出的一念安暖。光阴旧了,却越发柔软了,于是,那岁月里的一份懂得,便如经年的相思,又一次在远去的眉眼间,许下一段如水的相逢。    光阴长了,岁月远了,梦似乎也轻了。寂寂时光里,不再执着于生命的厚重和沧桑,只把那简单的日子,静默成花香,开成一朵心境的淡然;把那柴米油盐的烟火,在朴素的光阴里,流淌成细水长流的陪伴;或把一段清丽的文字,在清浅的喜悦里,念成一份安静的暖。
5 0 2682天前
admin
4813
作者:枫林秋水  每个季节都有诗意的芬芳,每段时光都有温情的暖。光阴流转,从朝霞到日落,从春花到冬雪,起落浮沉的人生,交织轮回的岁月,最美的光阴,总是在红尘最深处,绚烂一泽安暖、温馨的明媚。    喜欢静静的伏在桌前,细数着岁月的温良,写下一行行干净的文字,借着光阴给予的静好,兀自清欢。抬头,便是冬日的阳光透过窗户,照进一片和煦的温暖。    案几上的花瓶已经空了许久,瓶口已经落了尘。没了盛开的花束,虽然少了些鲜艳和生动,但也不用再打理,只守着一份闲适,倒也别是一番好处。    窗外,一条清静的小径,薄薄的雪稀稀疏疏的覆盖着行人走过的痕迹。不知道有多少花开花落,曾经在这里留下难忘的刻骨铭心;也不知有过多少成双成对的脚印,从这里走出去,然后从此分开。    世象万千,有些时候,人和人之间,犹如隔着一层永远也不会捅透的纱。凡尘里的故事,似乎有着太多的相似,只是谁也不想过早提出散场的结局。    北方的冬天,远离尘世的喧嚣,一炉火就是极好的暖了。烧一壶沸腾的热水,沏一壶清静的茶,沉下几颗繁杂的思绪,浮上一片静谧的安宁。杯中的厚重,浸泡着尘世的薄凉和沧桑;入口的清淡,品尝着日子的平淡和安详。    岁月里,寻一婉真情的幽香,淡淡的温暖,在经年的过往里,拥着人生的漫长,轻吟浅唱。一场落尽的花事,飘去落在风中的荒凉,清心以对,搁浅往事的忧伤;一份岁月的唯美,盈一抹淡然的微笑,走过寒凉的风景,相安无言的惆怅。    生命里,每一次相遇,都是久别重逢。遇见,不必在最美的年华,无论早晚,只要灵魂不再孤单,自深情的那一刻起,便将余生溢满幸福,让年华开满绚烂。从此,光阴含笑,岁月静好。    岁月的葱茏,总是在薄情的世界里,承受着无情的悲欢离合。有时候,不得不接受那些无法挽回的现实,但命运的经历也告诉我们,对于生活,真正想要的无需太多,一份真诚的爱,一份简单的暖,就够了。    光阴里,总有一些轻轻的柔软,似乎在等待一场华丽的雨落,好让昨日的梦呓,留下一笺岁月的留白。于是,一痕浅墨,便带着一份芬芳的执念,将一份经年的懂得,邀进一季行走的梦里。    生命是一场不断前行的历程,每一季岁月的花落花开,都会让你在生命的释放中,越来越多的拿出心底的善良和真诚,充满年华的丰盈;每一段时光的流逝,都会载着你走过命运的山高水长,摇落一树尘世繁杂的烟雨,相守一份平静、淡然的安宁。    日子,因简单而平静;生活,因平静而安宁。其实,生活并不需要那么多的诗和远方,一杯茶,一本书,一段时光,一份无悔和一颗温暖的心,便可在简单和宁静中,写满岁月的芬芳。
6 0 2682天前
admin
5309
作者:Channing Wu链接:https://www.zhihu.com/question/19730741/answer/46355754来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。说一下,我第一次确实是在某微信公众号看到的,下面有评论说其实原出自《博物》,我这边调查了一下,确实如此。故修改之。------------------------------------我是分割线--------------------------------------------首先,如此多的赞真的很惶恐,我只是转载了一下而已,而且最初还傻傻的不知道原本出自哪里,后经评论区提醒才知道最先出自博物君。现在统一回答一下我能回答的一些问题(因为有的我自己也没种过):1. @rayJ答主,这些之后会长出果子吗?(我比较关心这个!)————这个一般是长不出的,因为毕竟是盆栽,而且很多水果的生长环境跟室内是有很大差别的。2. 长大以后怎么办?———长大了就直接准备下一盆吧,不过有时候确实会舍不得,自己养的有成就感,有感情在的。3. 杯子底必须是有洞的吗?一般能喝水的陶瓷杯能用吗————一般只要是个容器都可以,只是要注意浇水,水多了会涝,烂根。4. 为什么龙眼要每天都换水呢?难道是跟氧气含量有关?————一般种子发芽前会做有氧呼吸,换水保证含氧量。5. 大概能长多久?认真浇水大概什么时候会死?————一般一个多月最多。6. 不小心种出了枇杷,我想知道下面应该怎么办,任其生长?————枇杷很多地方都能长,而且可以结果,如果有地方的话可以考虑种在地下。如果不死的话是会结果子的。7. 你在火龙果一节说: ⋯不可泡水两天以上,否则会发芽,⋯ 你本来就想让它发芽,为什么不就醤子呢?接下来的步骤好麻烦,能不能粗放些,直接把果肉和籽一齐种下去?—————火龙果种子很小,同时也很娇嫩。如果发芽了的话在种容易伤到,然后 就死了,死了。-------------------------------------------------分割线------------------------------------------------再次感谢。。注意到 @欧小羊 的回答中没有给出具体的种植方法。我这边转一个附带种植方法的。前方多图,另有好几种本人并未亲自尝试过,而且尝试过的做出的效果也还行。看着种子慢慢的发芽,变绿,长出叶子还是很有成就感的。【龙眼森林】龙眼其实很容易种,吃龙眼时不妨把核留下来试试。龙眼泡水前需要把顶端的果肉及白色软组织剔除干净,否则以后容易招虫子。&lt;img src="https://pic2.zhimg.com/66f1e0d3c82aca395b03113db0a22319_b.jpg" data-rawwidth="307" data-rawheight="200" class="content_image" width="307"&gt;1、泡水两天的龙眼,外壳已经逐渐裂开,需要每天换水。&lt;img src="https://pic3.zhimg.com/57dd0764df5594381fc74f0a5cc859f6_b.jpg" data-rawwidth="422" data-rawheight="268" class="origin_image zh-lightbox-thumb" width="422" data-original="https://pic3.zhimg.com/57dd0764df5594381fc74f0a5cc859f6_r.jpg"&gt;2、约泡水一周,芽点朝上,由外往内排列种进盆器里。&lt;img src="https://pic2.zhimg.com/782294c77dd3394670bfa784e73f859d_b.jpg" data-rawwidth="414" data-rawheight="262" class="content_image" width="414"&gt;3、每天喷两下水,一周后就开始发芽啦。&lt;img src="https://pic3.zhimg.com/ab81a5b12db766451f3a934fb996bc0a_b.jpg" data-rawwidth="415" data-rawheight="260" class="content_image" width="415"&gt;4、十几天后,小芽就开始“比个头”。&lt;img src="https://pic1.zhimg.com/3aa5e1563247974a3418a92cc6cfb57c_b.jpg" data-rawwidth="411" data-rawheight="553" class="content_image" width="411"&gt;5、一个月左右,小森林就长成啦。你能把它和你吃的龙眼联系到一起吗?&lt;img src="https://pic2.zhimg.com/19abbf7e138e26269c7e5eba7317b929_b.jpg" data-rawwidth="407" data-rawheight="264" class="content_image" width="407"&gt;6、龙眼盆栽的最大观赏点就是颜色多变的叶子,新叶是红色,之后变成黄色,再变成绿色。&lt;img src="https://pic2.zhimg.com/f8af57b6241c10b9e184d157e716a581_b.jpg" data-rawwidth="407" data-rawheight="262" class="content_image" width="407"&gt;【柠檬森林】1.吃剩的柠檬籽,水里泡一下。&lt;img src="https://pic1.zhimg.com/3ad72c777a271783368cbbf13c9b73ac_b.jpg" data-rawwidth="410" data-rawheight="273" class="content_image" width="410"&gt;2.用镊子把表面的壳去掉。&lt;img src="https://pic4.zhimg.com/2a22835a6a6edea7d7ff0e9859766ffb_b.jpg" data-rawwidth="411" data-rawheight="260" class="content_image" width="411"&gt;3.然后找个自己喜欢的器皿或杯子装上湿润的泥土,把种子全部摆好,小头朝上。&lt;img src="https://pic3.zhimg.com/846635082f8f909f22c736b379b145b2_b.jpg" data-rawwidth="410" data-rawheight="270" class="content_image" width="410"&gt;4.然后上面用粗砂或小石子盖上。也可以盖上保鲜膜,2到3天喷点水,一周左右发芽。&lt;img src="https://pic4.zhimg.com/e925532ab0c896ff487e6b3dada2cf7b_b.jpg" data-rawwidth="410" data-rawheight="267" class="content_image" width="410"&gt;5.发芽后也是2到3天喷点水保持湿润,以助生长。&lt;img src="https://pic3.zhimg.com/901b0ec4fcd46b1652265f09777675f6_b.jpg" data-rawwidth="410" data-rawheight="274" class="content_image" width="410"&gt;6.这个是成品图了,很漂亮吧,给你的办公桌书桌增加一抹绿吧。长成这么高的话,如果嫌他太浓密也可以将他分几株到别的地方去进行培养。&lt;img src="https://pic2.zhimg.com/96c8b88511c23a704f2c40838dfc4631_b.jpg" data-rawwidth="410" data-rawheight="322" class="content_image" width="410"&gt;【火龙果森林】火龙果成熟的果实为红色皮,内部为白肉或红肉,属肉质浆果,红皮上有狭长形肉质鳞状片,果肉中含有如芝麻大小的种籽,一粒成熟的果实中约含有仟粒的种籽,一点点火龙果肉分离的种子就足够种植出盆栽。1.将火龙果切成两半,用不锈钢汤匙轻轻将果肉刮入容器中。&lt;img src="https://pic1.zhimg.com/ab34570fcec70ced80bd867c03f5acdc_b.jpg" data-rawwidth="500" data-rawheight="333" class="origin_image zh-lightbox-thumb" width="500" data-original="https://pic1.zhimg.com/ab34570fcec70ced80bd867c03f5acdc_r.jpg"&gt;2.果肉加水稀释后用手指轻轻搓揉,尽量使果肉与种子分开。&lt;img src="https://pic2.zhimg.com/19d7176c8924a866fcd6c96f7c462f39_b.jpg" data-rawwidth="500" data-rawheight="331" class="origin_image zh-lightbox-thumb" width="500" data-original="https://pic2.zhimg.com/19d7176c8924a866fcd6c96f7c462f39_r.jpg"&gt;3.再将稀烂的果肉倒入短丝袜,继续搓揉几下,接著就泡水1天,不可泡水两天以上,否则会发芽,隔天再继续搓揉,可使果肉全部挤出,只剩黑色的种子,看起来有点像黑芝麻。&lt;img src="https://pic1.zhimg.com/7ce12602fb1a96de10d1cd118bb7c1e0_b.jpg" data-rawwidth="500" data-rawheight="328" class="origin_image zh-lightbox-thumb" width="500" data-original="https://pic1.zhimg.com/7ce12602fb1a96de10d1cd118bb7c1e0_r.jpg"&gt;4.将丝袜提起滤干水,可用卫生纸吸干种子上的水,取出种子平铺于盘子上,利用电风扇轻轻吹,使种子完全干燥,粒粒分离,即可开始种植。&lt;img src="https://pic2.zhimg.com/7eadd11371e57162f29f2ae6c179f649_b.jpg" data-rawwidth="500" data-rawheight="333" class="origin_image zh-lightbox-thumb" width="500" data-original="https://pic2.zhimg.com/7eadd11371e57162f29f2ae6c179f649_r.jpg"&gt;5-9.选适合的无洞的盆器,或将有洞孔的盆器填平洞口,放入无菌的培养土,约九分满,并喷洒一些水使表面上的土非常潮湿,再将种子均匀的铺撒在培养土上。&lt;img src="https://pic3.zhimg.com/157298e439fe933cbf03f607dbb66712_b.jpg" data-rawwidth="500" data-rawheight="332" class="origin_image zh-lightbox-thumb" width="500" data-original="https://pic3.zhimg.com/157298e439fe933cbf03f607dbb66712_r.jpg"&gt;&lt;img src="https://pic1.zhimg.com/3a49f1bf03b1e3c70948163cd31fbe64_b.jpg" data-rawwidth="500" data-rawheight="332" class="origin_image zh-lightbox-thumb" width="500" data-original="https://pic1.zhimg.com/3a49f1bf03b1e3c70948163cd31fbe64_r.jpg"&gt;&lt;img src="https://pic4.zhimg.com/1e6412c38408638b6cd5661444530237_b.jpg" data-rawwidth="500" data-rawheight="334" class="origin_image zh-lightbox-thumb" width="500" data-original="https://pic4.zhimg.com/1e6412c38408638b6cd5661444530237_r.jpg"&gt;&lt;img src="https://pic1.zhimg.com/5ab20e92e1592a0e2ad9e6beeec03364_b.jpg" data-rawwidth="500" data-rawheight="333" class="origin_image zh-lightbox-thumb" width="500" data-original="https://pic1.zhimg.com/5ab20e92e1592a0e2ad9e6beeec03364_r.jpg"&gt;&lt;img src="https://pic2.zhimg.com/71a4a8e9f1676811cbe6b8e9893252ed_b.jpg" data-rawwidth="500" data-rawheight="332" class="origin_image zh-lightbox-thumb" width="500" data-original="https://pic2.zhimg.com/71a4a8e9f1676811cbe6b8e9893252ed_r.jpg"&gt;10.在种子上喷水几次后,用保鲜膜包起来,可保持表面潮湿,然后每天掀开来喷水一次,直到长出新芽后才完全掀开。&lt;img src="https://pic3.zhimg.com/d858c7525b964df7863c32723133f99e_b.jpg" data-rawwidth="500" data-rawheight="333" class="origin_image zh-lightbox-thumb" width="500" data-original="https://pic3.zhimg.com/d858c7525b964df7863c32723133f99e_r.jpg"&gt;11.一周后即可长满整个盆面,约有1公分高,种子的外壳会陆陆续续掉落,整盆感觉绿草如茵,欣欣向荣,绿意盎然。&lt;img src="https://pic4.zhimg.com/34cf7aa9027112bdb786904e05c408b3_b.jpg" data-rawwidth="415" data-rawheight="362" class="content_image" width="415"&gt;12.二周后又长高一些,约有2公分高,叶子更加紧密厚实,两片叶子的颜色转为黄绿色,摆放在办公室或客厅都非常适合,有清爽舒适的感觉。&lt;img src="https://pic1.zhimg.com/467c7c3e1b9417e5f6879649d3474878_b.jpg" data-rawwidth="385" data-rawheight="338" class="content_image" width="385"&gt;四个月左右,第二层次像仙人掌的小刺,就会开始长出来,这是六个月后的样子,变成肥肥胖胖的仙人掌,超可爱的。&lt;img src="https://pic4.zhimg.com/03d0d2366994f3551e418834b399daaf_b.jpg" data-rawwidth="500" data-rawheight="354" class="origin_image zh-lightbox-thumb" width="500" data-original="https://pic4.zhimg.com/03d0d2366994f3551e418834b399daaf_r.jpg"&gt;【柚子盆栽】1.这是吃柚子剩下的籽哦~&lt;img src="https://pic1.zhimg.com/bc2b6db795084f3c45d0b14af27cf510_b.jpg" data-rawwidth="593" data-rawheight="443" class="origin_image zh-lightbox-thumb" width="593" data-original="https://pic1.zhimg.com/bc2b6db795084f3c45d0b14af27cf510_r.jpg"&gt;2. 用镊子把表面的壳去掉&lt;img src="https://pic2.zhimg.com/251cdc01ae4e9e964dd6242c4a3c17d9_b.jpg" data-rawwidth="593" data-rawheight="445" class="origin_image zh-lightbox-thumb" width="593" data-original="https://pic2.zhimg.com/251cdc01ae4e9e964dd6242c4a3c17d9_r.jpg"&gt;3.用水泡上5~7天,每天都要更换水,这样水才不会臭,籽也不会坏掉&lt;img src="https://pic1.zhimg.com/15c907c0daf7f40a9e90599bd2ef9e70_b.jpg" data-rawwidth="593" data-rawheight="440" class="origin_image zh-lightbox-thumb" width="593" data-original="https://pic1.zhimg.com/15c907c0daf7f40a9e90599bd2ef9e70_r.jpg"&gt;4.找个自己喜欢的器皿或杯子装上湿润的泥土,将泡过的柚子籽在皿器中摆好,小头朝上。&lt;img src="https://pic1.zhimg.com/edd742bbafb4daa2da34bd40dc2a0bc0_b.jpg" data-rawwidth="593" data-rawheight="443" class="origin_image zh-lightbox-thumb" width="593" data-original="https://pic1.zhimg.com/edd742bbafb4daa2da34bd40dc2a0bc0_r.jpg"&gt;5.上面用粗砂或小石子盖上&lt;img src="https://pic4.zhimg.com/cc33ed7c64d3decdfa61ca9439e8abff_b.jpg" data-rawwidth="593" data-rawheight="382" class="origin_image zh-lightbox-thumb" width="593" data-original="https://pic4.zhimg.com/cc33ed7c64d3decdfa61ca9439e8abff_r.jpg"&gt;6.上面也可以盖上保鲜膜,2到3天喷点水,一周左右就发芽了&lt;img src="https://pic3.zhimg.com/75a6e76e1d8edf1f65257b60c30e3e7e_b.jpg" data-rawwidth="593" data-rawheight="444" class="origin_image zh-lightbox-thumb" width="593" data-original="https://pic3.zhimg.com/75a6e76e1d8edf1f65257b60c30e3e7e_r.jpg"&gt;7.发了芽也是2到3天喷点水保持湿润,有助生长&lt;img src="https://pic4.zhimg.com/25ea00923f30696769b65508190de66b_b.jpg" data-rawwidth="593" data-rawheight="738" class="origin_image zh-lightbox-thumb" width="593" data-original="https://pic4.zhimg.com/25ea00923f30696769b65508190de66b_r.jpg"&gt;8.这个是成品图,很漂亮吧,给你的办公桌、书桌增加一抹绿吧,长成这么高的话,如果嫌他太浓密也可以将他分几株到别的地方去进行培养。注意事项剥皮时不要破坏里面果实的表皮,发芽时要保证湿度,种植不可太过于密集。【萝卜盆栽】切菜时把一只好看又肥硕的胡萝卜头部忍忍心切下一大块,扔在水器中,由它疯长到这样。&lt;img src="https://pic3.zhimg.com/aecf2ae761c09cc5f6647895fdd4bebe_b.jpg" data-rawwidth="429" data-rawheight="565" class="origin_image zh-lightbox-thumb" width="429" data-original="https://pic3.zhimg.com/aecf2ae761c09cc5f6647895fdd4bebe_r.jpg"&gt;尽量放在细长的水器中生长,叶子会笔直地向上窜得相对高,记得常换水。 长多叶子后再另取出摆放在适合的美容器中,这样造型才会比较挺拔有活力。否则它的叶子会边长边散开好象没有生气。&lt;img src="https://pic1.zhimg.com/7ca24e5534578f72d258833d4d32c860_b.jpg" data-rawwidth="408" data-rawheight="534" class="content_image" width="408"&gt;【芋头盆栽】芋头是在阳台上种得最早的蔬菜之一,因为芋头既可以作为蔬菜种植,也可以作为观赏植物种植,它的形态类似海芋和滴水观音,摆在家中是一道美丽的风景线。&lt;img src="https://pic2.zhimg.com/2bdedb65dff54fb0c2d4b6c19a65567d_b.jpg" data-rawwidth="493" data-rawheight="357" class="origin_image zh-lightbox-thumb" width="493" data-original="https://pic2.zhimg.com/2bdedb65dff54fb0c2d4b6c19a65567d_r.jpg"&gt;芋头管理较粗放,对土壤、水肥和光照要求不严,几乎没有病虫害,观赏时间长,可食用部位和时间也很长,非常适合想在阳台种菜的朋友试一试。种芋是在超市购买的食用芋头,用的是自配的盆栽土,种后没有再施肥,一天只接受一到二小时散射光照射,有时摆在客厅几天才出去晒一下太阳。但是不能缺水,一 天浇一到两次水,还要不时向叶面及四周喷水。第一盆芋头是在立春后不久种植的,白底蓝花瓷盆,底部有孔,30公分直径,高26公分。将盆栽土装上2/3, 将芋头芽朝上摆好覆土浇水,出苗后保持湿润,长势喜人。后期管理重点是浇水,由于底部有孔,每次浇水量有限,所以盛夏时节一天要浇两次水。第二盆是6月 17号种的,有意尝试在夏天种植。纯白多边圆瓷盆,底部无孔,是利用种水仙的花盆种的,20公分直径,高16公分。盆虽然小,但由于底部无孔,芋头的特性 是不怕水,所以每天只需要浇一次水,只接将水淹没土面。【土豆盆栽】买土豆时专挑眼多的买,这样的土豆发芽率高。买回后放在塑料袋里,让它在自然条件下发芽。每个土豆上面都会有好几个小芽萌芽,有的还长出来了一些张牙舞爪的白生生的小根,啊,可以种了!&lt;img src="https://pic1.zhimg.com/67916896ba727cde65bbde1e6d3f015c_b.jpg" data-rawwidth="494" data-rawheight="353" class="origin_image zh-lightbox-thumb" width="494" data-original="https://pic1.zhimg.com/67916896ba727cde65bbde1e6d3f015c_r.jpg"&gt;1、将一个土豆切成二至四块,每块上面一定要有芽,尽量让每块土豆上的芽眼分布均衡;2、在堆满泥土的花盆里挖一小坑,埋入土豆。3、种完后将土盖平,如太干要浇水。&lt;img src="https://pic4.zhimg.com/5be808852b9a6ecee188fa89463dd57b_b.jpg" data-rawwidth="497" data-rawheight="352" class="origin_image zh-lightbox-thumb" width="497" data-original="https://pic4.zhimg.com/5be808852b9a6ecee188fa89463dd57b_r.jpg"&gt;
7 0 2730天前
admin
5216
碎语 有图   
常常的,生活中走着走着就倦了:浮云游影,沧桑世态,什么都让人灰心。那时的我,最想做的就是把自己藏起来,“躲进小楼成一统,管它冬夏与春秋”。 躲在房间里,从第一缕霞丝泻在身上,到正午的艳阳暴晒窗棂,然后就是夕阳的余晖在身边游移,我静静地坐在地板上,什么也不想,什么也不做,生命在光影中流逝。每一次灰心的过程都是一样的,在光影流离中等待着心灵的复苏;在日转星移里静望梦想的回归。 这,也许是一种休息;这应该是一种休息。 然后,当街路上的霓虹灯开始闪烁时,心底的梦想就开始雀跃了。关于怎样充实生活,怎样不断提高自己的心灵素质,怎样更深沉地去体会、去热爱生命。。。。好多好多关于生活的梦想就像春天枝头的花苞,春雨后竞相开放。 阴霾散后的天空更澄净,灰暗过后的心灵充盈力量。原来,每一次的休息都预示着一个全新的、美好的开始;放眼望去,天空更深,道路更远。 你也一定有灰暗的时候,那么就把这段过程看作是一次整装待发的休息吧——明天,启程的路定会风和日丽! 摘自:儿童文学2005年刊
7 0 2738天前
admin
5794
     最近几天频繁听说好几个好朋友和恋人分手了,有男有女,有直有弯。看到很多失恋的好朋友每天无所事事,以泪洗面,借酒消愁之类的,我是无奈伤心愤怒那个百感交集,不禁一肚子话想对朋友们说。 失恋之苦,刮骨剜心,短则数月,长则一生。如张爱玲说:“长的是痛苦,短的是一生”。     记得大学第一和女友分手的时候,每天熬夜闲走到三点不睡觉。一月份的冬天晚上,我每天都绕着紫荆五号楼下(女友宿舍)一圈又一圈的走,总是想着把她叫出来,向她认错请求原谅。每次发短信都是得到拒绝的回复。到了后来也就不发短信,还是每天绕着宿舍走。我就这样一圈又一圈的走了一整个期末的冬夜。每天白天就是在紫荆食堂四楼西侧窗户边的一个位置坐着,因为那里是我们每次一起吃饭的地方。我也会买两杯饮料,一杯她爱喝的,一杯我爱喝的,摆在我对面,设想着她还坐在那里。     那个阶段正值期末,而且我还报了托福班,最后托福没有去上,也没有考前突击,最后结果就是托福没学,期末成绩险些挂科。放假到了家里每天也是两点睡,十二点起床,爸妈也是特别担心,跟着着急。我就这样每天不学习,不健康作息的状态就这样持续了将近半年年。那个半年里,我每天都只是靠闲书度日。朋友们跟着我着急,我也不敢跟家长说我的状态,只告诉他们我很好。    后来有一天,事情转变了。偶然机会我在伟伦楼和某位事业有小成的学长(学长还比较年轻)遇到,他问我最近怎么样,我跟他说了我的情况。他说巧呀,我也失恋了。我说多久了?他说一个月。我说:“学长你不伤心么?”他说:“我当然伤心。”我说:“但是看不出来啊。”他说:“我还要做事情,拼事业,照顾爸妈,哪有时间颓废,未来的宝宝还等着我养呢。”我瞬间醒悟了。    是阿:“我还要做事情,拼事业,照顾爸妈,哪有时间颓废,未来的宝宝还等着我养呢。”从那以后,纵然我还是很伤心难过,但是每当要颓废的时候,我就对自己说师兄的那句话。渐渐的,我的一切的生活都恢复正轨。     一直到毕业,我又谈了两次恋爱,虽然最后都是以分手告终,十分难受,痛苦之情亦如当初,但是我再没有发生因为失恋痛苦而荒废学业,打乱生活节奏的事情。纵然每天咬着牙悲痛上课,也还是挺了过来。我最终在失恋期间完成了一切我该做的事情,没有让朋友担心,更没有让家人操心。我始终记得那一句:“我还要做事情,拼事业,照顾爸妈,哪有时间颓废,未来的宝宝还等着我养呢。”     智商看追求,情商看分手——把人的层次区分开来的,就是你在分手的伤心阶段处理生活的态度。如果分手颓废下去,只会进一步向离开你的人证明你的幼稚与无知。如果你幻想前男(女)友因为看到你的难受而回心转意,那真是幼儿园思维。你的颓废只会让离开你的人坚定离开你的决心,因为谁都不会愿意跟一个遇到情感挫折就会一蹶不振的窝囊废过一辈子。     男生也好,女生也好,青春年少,风华正茂,就算和恋人分手了,日子就不过了?不要动不动说他(她)是你生活的全部,没有他(她)你活不下去了什么什么的。没有他(她)的时候谁把你拉扯大,谁给你买的第一个书包,谁教导你love怎么拼写,谁告诉你三角形内角和180度,谁帮你签到,谁没事骂你二货然后一起DOTA一起去吃麻辣香锅?你挥霍着逝者憧憬的生命,浪费着老人羡慕的青春,糟蹋着爸妈辛苦的血汗钱,呻吟着朋友们听吐了的“为什么为什么为什么”,结果你他妈的告诉我这做一切仅仅是为了一个已经不关心你死活的人?     如果不想分,就去心平气且不卑不亢地挽回一次,记住只有一次,告诉他(她):“我爱你,给我一次机会好不好?”如果回答是肯定的,那就继续好好爱,对的起人家给你的机会;如果回答是否定的,那就酷一点,转身,流泪,然后咬着牙继续过日子。真爱你的人不需要第二次挽回,不爱你的人挽回一万次也没有用。      世界上没有什么比指望前男友或者前女友回头的事情更幼稚的了。不要再跟我说他(她)当年跟你海誓山盟如何如何,一辈子八辈子如何如何。他(她)没有骗过你,当时说的话是真心的,他(她)就是要以后“娶(嫁)你”,以后要对你好一辈子,因为那时候他(她)爱你;现在跟你说的话也是真心的,他(她)就是“不爱你了”,就是“已经喜欢上别人了”,因为现在他(她)不爱你了。爱情无关乎诚信,关乎诚信的是婚姻。不要拿着当年荷尔蒙催生的文字来约束你面前这个鲜活的自由人。你要他(她)如你一样实践曾经的海誓山盟,前提是他(她)当年爱你爱到跟你求婚最后领证。(我坚定的相信:爱他(她),就嫁(娶)他(她))。      朋友,你不要妄想将对方分手时候的各种“不合适”“没感觉”的理由各个击破。爱情不问因为所以,只问是否可以。爱情这事,不是个思考的活,是个冲动的活。思考万千,没感觉最后也是白扯。最终决定两个人在一起的还是感觉,而不是用Excel表格或者Stata统计出来的最优解。两个人在一起与否是任何计算机或者塔罗牌都算不出来的。如果感觉够强大持久求婚了领证了生娃了,恭喜你们修成正果;如果感觉流失到流逝,人家提分手,挽回一次没用,那就哭一场,醉一场,然后咬着嘴唇继续刷GPA去。      我们不是没心没肺不念旧情,关键是眼泪哗哗的念旧情的时候一定要健康生活下去。泪要流在书本上,不要流在酒杯里。如果你颓废下去,那是对自己爸妈朋友们的没心没肺不念旧情。有爱人的时候要好好珍惜,但是一旦爱情逝去不能挽回,我们一定要保重好自己的身体和生活,不要让正在爱我们亲人师长朋友伤心难过。还是那句话:“我还要做事情,拼事业,照顾爸妈,哪有时间颓废,未来的宝宝还等着我养呢。”      只要我们咬着牙度过了最难受最痛苦的那个阶段,以后的生活依旧美好,当然前提是你每天以泪洗面的时候手里拿着的是一本GRE红宝书而不是一瓶二锅头。等你的这份感情对你的影响彻底过去的时候,那时候你再回头望望,真是“也无风雨也无晴”。时隔多年,哪天你带着爱人和孩子一家三口或者几口,开着玛莎拉蒂郊游时候再次遇到了他(她),你会回忆起他(她)曾经带给你的甜蜜和成长,然后微微一笑,说一句:最近还好吧?     朋友,如果失恋了,最多让自己绝逼哭个三天颓废个三天,然后不管天塌地陷还是口腔溃疡都上课,看书,处理数据或者去DOTA去夜店等等做你本来该做想做的事情。如歌词里唱的:“今天哭,明天笑,不求有人能明了,一身骄傲”。然后你慢慢努力,健康生活,以后找个好伴,给爸妈生个胖孙子(女),事业有成,最终你的生活过的像新年贺词一样。等到你的孩子某天失恋了,你可以语重心长地告诉他(她):孩子,让离开你的人再关注你的唯一办法,就是你超越了他(她)梦想的生活。      最后我想说,如果你在恋爱ing,一定珍惜眼前人,不要等到失去以后再过咬着牙擦着泪写着作业的日子。如果你失恋了,那就总结经验,思考不足,感激前男(女)友给你的带来的成长,争取下次恋爱就是你最后一次。你需要做的就是尽量不要让同样的伤痛日子再经历一次。
8 0 2760天前
admin
5591
原作者:S.A.突袭,发表于:黑客X档案  高三那道鬼门关的考验,我考上了一所大学,但这是一所很普通的大学,普通的毕业就意味着失业,于是我毅然选择了休学。  刚休学的时候,我整天把自己关在家里,害怕见人,害怕见到别人那如剑的目光。后来,我实在受不了了,便收拾了东西,要回老家,回那个普通的江南水乡。父母看到我背着行李,以为我要离家出走,死活不让我出去。最后,由于我的坚持,我妈就陪我回到了老家。  老家的河很美,我总对我妈说,我投河自尽死了也值。我妈总是严厉地呵斥着让我停止这样的想法。  我总是站在老家门口的小桥上,看桥下船来船往,任那柔和的风抚摸我的脸庞,快乐的流泪。我快乐,是因为我可以享受这么美的风景;我流泪,是因为我已告别了学生时代。  刚到老家的第二天,我接到一个电话,是伟子打来的,他说他要走了,要去一个遥远的地方。  我说,我去送你。  他说,不用了。  沉默…..  伟子是我幼时的玩伴,小学时的同学,初中时的舍友,高中时的同桌。也不知道我们为什么这么有缘,这回高考也都只考上了一所学校,是同一所普通大学。只不过,他家有钱,它可以混个大学毕业,而我则不可以,因为我家里没有那么多钱让我在一所毫无用处的学校里挥霍。  上幼儿园时,我和伟子就总是撅着屁股看地上的蚂蚁,躺在草坪上看天上的浮云或星星,有时还会因为一块面包而大打出手。可孩子毕竟是孩子,打完架之后很快就会和好如初。  上小学时,我们经常不完成作业,然后告诉老师,我们忘了带了。其后果就是老师让我们站在走廊里。那时伟子总会紧握着拳头,很认真地对我说,我一定要杀了她!我说,好呀,到时候我帮你收尸。  到了初中,我和伟子在同一个宿舍,而且是上下铺,我上他下。也不知那床是从哪个历史博物馆里偷的,我一动它就晃个不停。弄得伟子早晨一迟到就对班主任说,雨霏昨晚一个劲的摇床,不让我睡。然后我的班主任就不分青红皂白的批我一顿,我比窦娥还冤呢!  那时我们虽然调皮捣蛋不听话不爱完成作业,但我们的成绩还是说的过去的,所以才考上了一所不错的高中。  在高中,我交了一个女朋友,她叫牧牧,很好听的名字,人长得也挺漂亮。伟子第一次见她时,竟瞅了半天,直到我狠狠地掐了他一下。  再后来,我和牧牧因事吵了一架,然后谁也不理谁。虽然不理,但我的心里却总是想着她。为此,我总是上课时被老师叫起来,问我一个问题,我说我不会,她便让我出去站着。伟子大力发扬助人为乐的传统美德,对我说,我们起码兄弟一场,你们的事,我帮你搞定!就这样,他开始“帮”我,最终使牧牧成了他的女朋友。  我本来听别人说过伟子和牧牧的传言,我不相信,直到那一天我看见伟子和牧牧牵着手走在大街上,我就知道,牧牧是伟子的了。于是那晚我喝的烂醉,在大街上狂吐不止,恰好碰见了伟子,她问我怎么了,我说我心痛。他夺去了我手中的酒,说,别喝了,今天你去我家睡觉,省得你爸妈生气。  我将酒夺回,使劲的喝,他一拳打在我肚子上,然后抓着我的衣服用膝盖磕我的胸口。  我推开他,问,你为什么打我?  他回答说,为情所困,值得吗?  我说,那你说兄弟和情哪个更重要?  伟子一拳打在我脸上,我在地上翻了个身,只听到他说,你该清醒清醒了,兄弟才是最重要的!  我大声嚷嚷道,那你把牧牧还给我!  他愣住了,我站起身,摇晃的站立着,拍了拍身上的土,转身就走。朦胧中,我听到他说,雨霏,你都知道了?其实爱一个人并不是过错,原谅   我,好吗?  我转身说,我现在不想见到你,你马上消失在我面前!  然后我就什么也不记得了。  当我第二天醒来时,我发现我是睡在伟子的家里,伟子在我旁边坐着,见我醒了,便让我喝解酒茶,我问他,你不上课?  他笑笑说,今天是星期天!  我也笑笑。  伟子的脸上突然显得异常忧伤,说,雨霏,昨晚….  我打断他的话说,昨晚的事情就让它过去吧,我们还是好兄弟。  说完,我冲他笑了笑。  他也笑笑,说了声“谢谢”。  我什么也没说,只是笑,但那笑下却隐藏了无比巨大的忧伤!  后来,我总是见到伟子和牧牧在一起开心的玩,一起去喝咖啡,一起去吃麦当劳,一起去滑旱冰,还有伟子骑单车送牧牧回家。每次见到他们在一起时,我总会躲开,有时他们看到了我,让我跟他们一起玩,我也会找个借口走掉,因为我怕我会当着他们的面哭出来,所以,我会躲到一个安静的角落里默默地哭。  我是一个外强中干的人,在别人看来,我是一个无论怎样都会笑的孩子,可在我的内心深处却有着无不酸涩的涟漪。我想牧牧跟着伟子会更好,我没有伟子那么大的胆量,在漆黑的夜里送牧牧回家;我也没有伟子那样宽大的肩膀,让牧牧可以依靠;我不能像伟子一样好好照顾她,因为我总是生病,我还需要别人来照顾我。  我宁愿让牧牧快乐的活,而我则快乐地流泪——为她的快乐而快乐,为她的离去而流泪。一切痛苦我都愿承担,只要牧牧过的好。伟子说我是个傻子,傻到再心爱的女孩打自己时都会关心地问她的手疼不疼。我没理他,因为我的确是这样的。伟子每天早晨都会在牧牧家的楼下等她,然后一起上学。伟子也真是够苦的,大冬天里也要等着,到牧牧出来时,他已变成了一个雪人。我认为伟子对牧牧是真心的,要不然上次牧牧的手冻伤了,他也不会骑上单车,去各个药店里找最好的药,却因为忘了戴手套而把自己的手给冻伤了。每当看到伟子对牧牧所做的一切时,我总是很感动,我承认,那些都是我办不到的。我也感到欣慰,因为牧牧找到了属于她的幸福。 我很想你因为我爱你没你在身边我便失去了力气我一直都在相识的地方等你可你早已远去是否你已将我忘记是否你已不再回忆难道我对你的爱你从没有留意我会一直爱你直到天荒地老直到天地合一哪怕你已不再美丽我也不会放弃爱你绝不是一朝一夕   朋友们总是祝福伟子,唯独我没有,因为让我祝我爱的人和另一个男人幸福,即使杀了我,我也办不到。虽然伟子抢走了我最爱的女孩,但我们的关系却没有因此而疏远。我们还会在一起玩,只是不会让牧牧在身旁。  伟子刚和牧牧在一起的时候,我不知道该怎么做,毕竟一个是我的兄弟,另一个是我心爱的人。取谁舍谁都要付出相当大的代价。这就好像站在一个岔道口,不知哪一条路能找到宝藏一样。可到后来,我看到牧牧和伟子在一起快乐的样子时,我决定不再去打扰她,不再让她不高兴。寒来暑往,春去秋来,日子很快就过去了。一转眼,我们已濒临高考。我已经习惯了在夜里偷偷地哭,伟子也好像一直觉得愧对于我,总是对我很好。  我和伟子的成绩很糟,糟的可以在年级排名的长榜中一眼找到,因为我们总是在最后。而牧牧的成绩却异常的好,好到可以用三根手指表示她在市内的排名。为此牧牧总是让伟子好好学习,也总是教伟子做一些对于我们来说是天书的题,伟子再学会后就教我,就这样,我们共同提高。  高考很快就到了,我和伟子出乎意料地考上了大学,牧牧则考上了清华。  九月初,牧牧要去美国找她的父母,我和伟子去机场送她。她在临走前只说了句再见,就匆匆上路了。  我开玩笑的说,你小子一定要把欠我的都还清再走。  伟子淡淡的说,这一世是不行了,下一世吧,我一定还清。  什么?我很吃惊地问,怎么了?  你不知道吗?伟子说,昨天是9月11日,牧牧乘坐的飞机撞上了五角大楼,她死了….  我感觉我心中的某样建筑“轰”的一声就倒了,眼前一片星光。  伟子说,我现在在我家的楼顶,我要去找她了,你多保重!  他说完,我便听到了呼呼的风声,还有那东西破碎的声音。  我拿着电话使劲地喊,伟子!伟子!……..可是信号已经中断。我放声大哭,仿佛看到了第二天的新闻“某男子从某某小区纵身跳下……”。  我走到小桥上,夕阳将河面映的通红,杨柳丝丝拂面,MP3中放着邓丽君的《我只在乎你》,“任时光匆匆流去我只在乎你,心甘情愿感染你的气息”。  我拿起一块石子,扔向水中,石子弹起又弹起,最终沉入水底。在它所经过之处留下了圈圈波纹。于是我想,人们总是希望自己的生活没有涟漪,可他们何尝知道,当他们不可能再有涟漪时,那便是他们的死期!  伟子,牧牧,你们走吧,黄泉之路不会孤独。  歌声中,我看到伟子和牧牧携手走向那完美的夕阳,还回头对我甜甜的笑………. 总认为我们有缘如今却阴阳相间你们走的如此突然只留下一句再见虽然你们已成过眼云烟但却永远活在我的心间不知是否有一只鸿雁可以传递我的思念天堂中的宫殿是不是飞翔的极限那一只鸿雁能不能到达你们身边请你们告诉我死亡到底是怎样的概念你们是否怀念人间河中那盛开的白莲是上天对你们的祭奠被夕阳染红的半边天见证了你们的誓言     十多年过去了,拉登大叔也已经被击毙,可是心里的痛却怎么也挥之不去。于是写下了此文以祭奠儿时的玩伴,以及短暂而又美好的回忆。
7 0 2761天前
admin
5667
一棵开花的树作者:席慕容 如何让你遇见我 在这最美丽的时刻 为这 我已在佛前求了五百年 求他让我们结一段尘缘 佛於是把我化做一棵树 长在你必经的路旁 阳光下 慎重地开满了花 朵朵都是我前世的盼望 当你走近 请你细听 那颤抖的叶 是我等待的热情 而当你终於无视地走过 在你身后落了一地的 朋友啊 那不是花瓣 那是我凋零的心...
5 0 2761天前
快速发帖 高级模式
桂公网安备 45010302000666号 桂ICP备14001770-3号
感谢景安网络提供数据空间
本站CDN由七牛云提供支持
网站已接入ipv6
免责声明: 本网不承担任何由内容提供商提供的信息所引起的争议和法律责任。
如果某些内容侵犯了您的权益,请通过右侧按钮与我们联系
Your IP: 3.141.2.191 , 2024-11-24 23:14:55 , Processed in 1.86718 second(s).
Powered by HadSky 8.4.9
知道创宇云安全