CHAOS DSK(?HENON P:"0HENON_S lPl6LOGISTIC PAPLOGISTIC_SxPxpLYAPUNOV  P!0LYAPUNOV_S; P;; 3 AAA AAA"BBBBBBBBBBBBBBBBSF ABB@B BBBBBBBBBBWEBXSBDBBFQB B?2BBBB?2BBBF ArB@BBBB@BBBB@bBBBBABKBBBABBBB@`BBBF ABAB[BBB?BBBB?2BBBB@B(BBB@BBBB@BBBF AB@@BBBBChBaoBs BDeBmoBnsBtrBatBioBn B- BHeBnoBn BEqBuaBtiBonBByB WF ABalBidB MBaaBloBulBi B- BOcBtoBbeBr B20B10BPrBesBs BSpBacBe BKeBy BToB CF A2BonBtiBnuBeBBB BBBB C@BBBBBBB CHBBB1B F AbCXBBBBB BBBBBBzBCBB$B BBBBCBB F AB CBBBCBBB CBC xB BuCaBBBB CbBBtBBF ABBBBB CBBB CBBB CBBB CBB>B CBBF AB CBBBC BB1B CBBBBB CnBBBC BB@B CF A"BBBBBB CBB!BBBBBB BBBBB C.BBBF ARBBBBB CJBBBBBB CBBBBBBB CjBC xB F ABuCaBB`CBBBBBCbBBB C BBBBnBCzBBJBF AC 8BBB|B BB$BCBB\BC 8B BBBCrBB\BC 8B CF ABBCjBB\BC 8B CBBBJBC BC 8BCBB\BC 8B CF ABBCBB\BC 8B CBBBJBCBC 8B C"BB BJBCBF ABBJBC 8BCbBB\BC 8B C4BBBJBCjBC 8BCBB\BC 8F ArB CVBBCBB\BC 8B CtBBCBB\BC 8B CBBBJBF ACBC 8B CBB`BJBC BCbBC 8BC8B BCBB`C|B C8BJB CB#BCBB\BC 8B CBBBJBC BF AC 8B CPBJB CB#BBBCBBB CBBBBnBBB|B CF A2B$BC BB\BC 8B C BB CBBB BJBBBB`C|B C:BJB F AbCHB#BCBB\BC 8B CbBBBJBC BC 8B CPBJB CtB#BF ABBCBBB CBBBBnBBB|B C0B$BC BB\BC 8B F ACBB CBB`BJBBBB`C|BC NB`C|B CPCTBBCPB BȠF AC4C(BȠC6C.BbC"BBBB BBC xB BuCXBB CJCRBBCJF A"BBBB BBC@BBBBB C\BBCJBBB`C@B C:BB F ARBuCYBBBBB C*BBBBBBBC BB BuCZBBBBF AB C`BBBBBBBC BB BuC[BBBBB CBBBB`F AC BBBBC B`C B BuC\BBBBB CBBBB`C BBF ABBC B`C B BuC`BB`ClB CJCRBB`C BCPB CPCTBBF ACNBCLBCPBBJBC 8B CB#BBJBB\BC 8BCrBBJBC 8F ABB C&BBBJBC BC 8BBBCBBB CBBBBnBBB|F ArB CB$BBJBCBC 8BC BBJBC 8BBBCBBB CbBF ABBBnBBB|B CtB$BBJBCBC 8BBBB CBBBJB F ACDB#BBJBCBC 8BBJBB\BC 8BCBBJBC 8B CB B F ACBB C4BJB BJC8BCBBJBC 8BCBB\BC 8B CBBF A2BJBB\BC 8BCBBJBC 8B C,B B CJBB C4BJB BJCB C:C6BBBB CnF A"BC@BBBBB CLBCJBBB CzBBBBB C0BBBBF ARCBCbBC 8BCBCjBC 8B`C|B BuC]B B CPCRBB`C B F ACPCVBB`C B CPB CPCRB BC8BC:BBBCB`F ACB BuC^B6B CLCRBB`C B CPCTBB`C B CNCRBB CPCRF ABB`C BCPBBBBB CHBBBBBCPB BbC"BBB CF A BCPB B"C(C4B"C.C6B`C B BuC_BB`C B BB CBBpBF A BBBBBCB[BBIBB TBBDBB@BEBBBaBB C BХCBBBF A rB CB[BBB|BBtB BBBBBB[BBB C jBBBBCB F A C tBB C BBB C B BB C BBB BB[BSLBBSTBBS|BBSBF A B[BBBBBB|BBTBBLBBLBB[LBBBBBBBBBF A BBBBBBBBBBBBBBBBBBBBBBBBF A 2BF 5:START 3 JLT INRNG * CHECK IF Y > WINDOW LOWER EDGENOTRNG B @REDO2INRNG MOV @ZX0,@FAC * PLACE ZX0 INTO FAC ****************************** CHAOS DEMONSTRATION USING ** THE HENON EQUATION ** X=Y+1-(1.4*X^2) ** Y=0.3*X ** BY WALID MAALOULI ** OCTOBER 2010 ****************************** DEF START+ REF VWTR,VSBW,VMBW,VSBR,VMBR,XMLLNK REF GPLLNK,KSCANGPLSTS EQU >837CKEYADR EQU >8374KEY EQU >8375:FAC EQU >834A * FLOATING POINT ACCUMULATOR7ARG EQU >835C * FLOATING POINT ARGUMENT2STACK EQU >836E * POINTER TO VDP RAM SUBRTN BSS 2 FPZL2 BSS 8 FPTMP BSS 8 FPTMP1 BSS 8 FPTMP2 BSS 8SAVLOC DATA >B000,>C800,>E000GXDAT DATA 0,0,0GYDAT DATA 0,0,0 GX DATA 0 GY DATA 0 ZX0 DATA 0 ZY0 DATA 0ZX1 DATA 255ZY1 DATA 191;SPRTY DATA >5300 * INITIAL WINDOW Y COORDINATE#M DATA >8040,>2010,>0804,>0201+WFLAG DATA >0000 * WINDOW FLAG)ZFLAG DATA >0000 * ZOOM FLAG1ZFLAG1 DATA >0000 * ZOOM LEVEL 2 FLAG*ZLEVEL DATA >0000 * ZOOM LEVEL ONE DATA 1 TWO DATA 2 DEC3 DATA 3'ASCW BYTE >57 * ASCII W'ASCE BYTE >45 * ASCII E'ASCX BYTE >58 * ASCII X'ASCS BYTE >53 * ASCII S'ASCD BYTE >44 * ASCII D'ASCB BYTE >42 * ASCII B'ASCF BYTE >46 * ASCII F'ASCQ BYTE >51 * ASCII Q+ENTER BYTE >0D * KEY+SPACE BYTE >20 * KEYBX BYTE >3F,>32,>00,>00,>00,>00,>00,>00 * 0.5 - INITIAL VALUEBY BYTE >3F,>32,>00,>00,>00,>00,>00,>00 * 0.5 - INITIAL VALUE2FP1 BYTE >40,>01,>00,>00,>00,>00,>00,>00 * 1.02FP2 BYTE >40,>02,>00,>00,>00,>00,>00,>00 * 2.04FP98 BYTE >40,>62,>00,>00,>00,>00,>00,>00 * 250.04FP175 BYTE >41,>01,>4B,>00,>00,>00,>00,>00 * 175.03FP128 BYTE >41,>01,>1C,>00,>00,>00,>00,>00 * 98.03FP96 BYTE >40,>60,>00,>00,>00,>00,>00,>00 * 96.04FP191 BYTE >41,>01,>5B,>00,>00,>00,>00,>00 * 191.02FCNST BYTE >3F,>1E,>00,>00,>00,>00,>00,>00 * 0.32FCNST1 BYTE >3F,>32,>00,>00,>00,>00,>00,>00 * 0.52FCNST2 BYTE >40,>01,>28,>00,>00,>00,>00,>00 * 1.42THREE BYTE >40,>03,>00,>00,>00,>00,>00,>00 * 3.02FOUR BYTE >40,>04,>00,>00,>00,>00,>00,>00 * 4.03FP64 BYTE >40,>40,>00,>00,>00,>00,>00,>00 * 64.02TITLE TEXT 'Chaos Demonstration - Henon Equation'.CREDIT TEXT 'By Walid Maalouli - October 2010')PRESSK TEXT 'Press Space Key To Continue' EVENSTART LI R0,>02004 BLWP @VWTR * RESTORE SIT TO >0000 LI R0,>04013 BLWP @VWTR * RESTORE PDT TO >8009 LI R0,>F000 * VALUE TO BE LOADED IN VR1K MOVB R0,@>83D4 * SAVE VALUE IN >83D4 (INTERPRETER WORKSPACE)8 LI R0,>01F0 * SELECTS TEXT MODE IN VR1/ BLWP @VWTR * START TEXT MODE CLR R09 LI R0,>0731 * SET COLORS GREEN ON BLACK BLWP @VWTR, CLR R0 * POINT TO SIT CLR R1A LI R2,960 * 960 SCREEN POSITIONS IN TEXT MODE5LOOP BLWP @VSBW * CLEAR SCREEN POSITION= INC R0 * POINT TO NEXT SCREEN POSITION DEC R2I JNE LOOP * REPEAT UNTIL ALL SCREEN POSITIONS CLEARED? LI R0,>7A * LOAD TEXT SCREEN LOCATION IN R04 LI R1,TITLE * POINT TO TEXT STRING0 LI R2,36 * LENGTH OF STRING4 BLWP @VMBW * PLACE TEXT ON SCREEN LI R0,>F4 LI R1,CREDIT LI R2,32 BLWP @VMBW LI R0,>286 LI R1,PRESSK LI R2,27 BLWP @VMBWNOSPC BL @KEYINP CB @KEY,@SPACE JNE NOSPC= LI R0,>07F1 * SET BACKGROUND COLOR TO BLACK BLWP @VWTR6 CLR @KEYADR * SELECT ENTIRE KEYBOARD* INITIALIZE BITMAP MODE LI R0,>A000D MOVB R0,@>83D4 * PLACE VALUE IN INTERPRETER WORKSPACE> LI R0,>01A0 * SELECT VR1 AND NEW VALUE (>A0), BLWP @VWTR * BLANK SCREEN LI R0,>02074 BLWP @VWTR * SIT ADDRESS AT >1C00 LI R0,>04034 BLWP @VWTR * PDT ADDRESS AT >0000 LI R0,>03FF3 BLWP @VWTR * CT ADDRESS AT >2000 LI R0,>053E> BLWP @VWTR * SPRITE ATTRIBUTE LIST AT >1F00 LI R0,>0603@ BLWP @VWTR * SPRITE DEFINITION TABLE AT >1800) LI R0,>1F00 * POINT SAL1 LI R1,SALDAT * POINT TO SAL DATA; LI R2,49 * NUMBER OF BYTES IN SAL DATA2 BLWP @VMBW * LOAD SAL WITH DATA, LI R0,>1F00 * POINT TO SAL LI R1,>D000B BLWP @VSBW * MARK SAL AS INVALID (BLANK SPRITE), LI R0,>1800 * POINT TO SDT? LI R1,SPRITE * POINT TO SPRITE DEFINITION DATAD LI R2,64 * NUMBER OF BYTES IN SPRITE DEFINITION> BLWP @VMBW * PLACE SPRITE DEFINITION IN SDT: LI R0,>1C00 * SIT INITIALIZATION ROUTINE CLR R15 LI R2,3 * THREE SECTIONS TO SIT>SITINI BLWP @VSBW * PLACE HIGH BYTE OF R1 INTO SIT- INC R0 * NEXT SIT BYTE9 AI R1,>100 * INCREMENT HIGH BYTE OF R1: JNE SITINI * R1 WILL GO FROM >00 TO >FF1 DEC R2 * SIT SECTION COUNT JNE SITINI+ LI R0,>2000 * POINT TO CT> LI R1,>E100 * DEFINE COLORS AS GRAY ON BLACK, LI R2,>1800 * LENGTH OF CT?CTSET BLWP @VSBW * WRITE COLOR BYTE TO CT POSITION, INC R0 * NEXT CT BYTE@ DEC R2 * KEEP TRACK OF REMAINING CT BYTES> JNE CTSET * REPEAT UNTIL END OF CT REACHED5 CLR R0 * START OF PDT IS >0000 CLR R1- LI R2,>1800 * LENGTH OF PDT1PDTSET BLWP @VSBW * CLEAR BYTE IN PDT- INC R0 * NEXT PDT BYTEA DEC R2 * KEEP TRACK OF REMAINING PDT BYTES? JNE PDTSET * REPEAT INTIL END OF PDT REACHED6 LI R0,2 * SELECT VR0 AND VALUE 21 BLWP @VWTR * START BITMAP MODE6 LI R0,>E000 * VALUE TO BE PUT IN VR1? MOVB R0,@>83D4 * SAVE INTO INTERPRETER WORKSPACE8 LI R0,>01E0 * SELECT VR1 AND VALUE >E0. BLWP @VWTR * TURN SCREEN ON* BEGIN CALCULATIONSREDO BL @KEYINP6 CB @KEY,@SPACE * CHECK IF SPACE PRESSED JNE NOTSPC B @SAVE7NOTSPC INC @>83D6 * DISABLE SCREEN BLANKING9 LI R0,>1900 * POINT TO VDP STORAGE AREA* LI R1,X * POINT TO X LI R2,8/ BLWP @VMBW * LOAD X INTO VDP9 LI R0,>1900 * POINT TO VDP STORAGE AREA= MOV R0,@STACK * ASSIGN STACK AS POINTER TO IT LI R0,FP2 LI R1,FAC2 BL @RADTRN * PLACE 2.0 INTO FAC CLR R05 MOVB R0,@GPLSTS * CLEAR GPL STATUS BYTE BLWP @GPLLNK# DATA >0024 * X^2 LI R0,FCNST2 LI R1,ARG2 BL @RADTRN * PLACE 1.4 INTO ARG BLWP @XMLLNK' DATA >0800 * 1.4*X^2 LI R0,FP1 LI R1,ARG2 BL @RADTRN * PLACE 1.0 INTO ARG BLWP @XMLLNK+ DATA >0700 * 1-(1.4*X^2) LI R0,Y LI R1,ARG0 BL @RADTRN * PLACE Y INTO ARG BLWP @XMLLNKE DATA >0600 * Y+(1-(1.4*X^2)) THIS IS NOW THE NEW X LI R0,FAC LI R1,FPTMP6 BL @RADTRN * SAVE RESULT INTO FPTMP LI R0,FP98 LI R1,ARG1 BL @RADTRN * PLACE 98 INTO ARG BLWP @XMLLNK$ DATA >0800 * 98*X LI R0,FP128 LI R1,ARG4 BL @RADTRN * PLACE 128.0 INTO ARG BLWP @XMLLNK( DATA >0600 * X*98+128 LI R0,FAC LI R1,FPTMP1+ BL @RADTRN * SAVE RESULT BLWP @XMLLNK9 DATA >1200 * CONVERT RESULT TO INTEGER- MOV @FAC,R8 * PLACE INTO R8 LI R0,FCNST LI R1,FAC1 BL @RADTRN * LOAD 0.3 INTO FAC LI R0,X LI R1,ARG/ BL @RADTRN * LOAD X INTO ARG BLWP @XMLLNK% DATA >0800 * X*0.3 LI R0,FAC LI R1,Y( BL @RADTRN * UPDATE Y LI R0,FP175 LI R1,ARG4 BL @RADTRN * PLACE 175.0 INTO ARG BLWP @XMLLNK% DATA >0800 * 175*Y LI R0,FP96 LI R1,ARG3 BL @RADTRN * PLACE 96.0 INTO ARG BLWP @XMLLNK( DATA >0600 * Y*175+96 LI R0,FP191 LI R1,ARG4 BL @RADTRN * PLACE 191.0 INTO ARG BLWP @XMLLNK. DATA >0700 * 191-(Y*175+96) LI R0,FAC LI R1,FPTMP2+ BL @RADTRN * SAVE RESULT BLWP @XMLLNK4 DATA >1200 * CONVERT Y TO INTEGER- MOV @FAC,R9 * PLACE INTO R9 LI R0,FPTMP LI R1,X( BL @RADTRN * UPDATE X C R8,@ZX0= JLE NOTRNG * CHECK IF X < WINDOW LEFT EDGE C R8,@ZX1> JHE NOTRNG * CHECK IF X > WINDOW RIGHT EDGE C R9,@ZY0> JLE NOTRNG * CHECK IF Y < WINDOW UPPER EDGE C R9,@ZY1> JLT INRNG * CHECK IF Y > WINDOW LOWER EDGENOTRNG B @REDO2INRNG MOV @ZX0,@FAC * PLACE ZX0 INTO FAC BLWP @XMLLNK9 DATA >2300 * CONVERT TO FLOATING POINT LI R0,FPTMP1 LI R1,ARG BL @RADTRN BLWP @XMLLNK. DATA >0700 * (X*98+128)-ZX0 LI R0,FAC LI R1,FPTMP4 BL @RADTRN * MOVE RESULT TO FPTMP9 MOV @ZLEVEL,@FAC * PLACE ZOOM LEVEL INTO FAC BLWP @XMLLNK9 DATA >2300 * CONVERT TO FLOATING POINT9 LI R0,>1900 * POINT TO VDP STORAGE AREA, LI R1,FOUR * POINT TO 4.0 LI R2,82 BLWP @VMBW * PLACE 4.0 INTO VDP LI R0,>1900 MOV R0,@STACK CLR R0 MOVB R0,@GPLSTS BLWP @GPLLNK$ DATA >0024 * 4^ZL LI R0,FPTMP LI R1,ARG BL @RADTRN BLWP @XMLLNK5 DATA >0800 * ((X*98+128)-ZX0)*4^ZL BLWP @XMLLNK2 DATA >1200 * CONVERT TO INTEGER MOV @FAC,R8C CI R8,255 * CHECK IF X BEYOND RIGHT SCREEN EDGE3 JLE XINRNG * SKIP PIXEL IF IT IS B @REDO2XINRNG MOV @ZY0,@FAC * PLACE ZY0 INTO FAC BLWP @XMLLNK9 DATA >2300 * CONVERT TO FLOATING POINT LI R0,FPTMP2 LI R1,ARG; BL @RADTRN * PLACE 191-(Y*175+96)NTO ARG BLWP @XMLLNK4 DATA >0700 * (191-(Y*175+96))-ZY0 LI R0,FAC LI R1,FPTMP4 BL @RADTRN * MOVE RESULT TO FPTMP5 MOV @ZLEVEL,@FAC * PLACE ZLEVEL INTO FAC BLWP @XMLLNK9 DATA >2300 * CONVERT TO FLOATING POINT9 LI R0,>1900 * POINT TO VDP STORAGE AREA, LI R1,THREE * POINT TO 3.0 LI R2,82 BLWP @VMBW * PLACE 3.0 INTO VDP LI R0,>1900 MOV R0,@STACK CLR R0 MOVB R0,@GPLSTS BLWP @GPLLNK$ DATA >0024 * 3^ZL LI R0,FPTMP LI R1,ARG BL @RADTRN BLWP @XMLLNK; DATA >0800 * ((191-(Y*175+96))-ZY0)*3^ZL BLWP @XMLLNK9 DATA >1200 * CONVERT RESULT TO INTEGER MOV @FAC,R9< CI R9,191 * CHECK IF Y BELOW SCREEN EDGE3 JLE DISPPX * SKIP PIXEL IF IT IS B @REDODISPPX BL @PLOT B @REDOSAVE C @ZLEVEL,@TWO JH CONT8 MOV @ZLEVEL,R2 * PLACE ZOOM LEVEL INTO R28 SLA R2,1 * MULTIPLY ZOOM LEVEL BY 2' MOV @GX,@GXDAT(R2) * SAVE GX' MOV @GY,@GYDAT(R2) * SAVE GYJ MOV @SAVLOC(R2),R1 * PLACE THE CPU MEMORY SAVE LOCATION INTO R1, CLR R0 * POINT TO PDT6 LI R2,>1800 * NUMBER OF BYTES IN PDT3 BLWP @VMBR * SAVE PDT IN CPU RAMCONT BL @KEYINP2 CB @KEY,@ASCW * CHECK IF W PRESSED JNE NXTK1? C @WFLAG,@ONE * CHECK IF THE WINDOW FLAG IS SET JNE NOTSET CLR @WFLAG; LI R0,>1F00 * POINT TO SAL ADDRESS IN VDP CLR R1? BLWP @VSBR * PLACE WINDOW Y COORDINATE IN R18 MOV R1,@SPRTY * SAVE WINDOW Y COORDINATE; LI R0,>1F00 * POINT TO SAL ADDRESS IN VDP LI R1,>D0003 BLWP @VSBW * CLEAR WINDOW SPRITE JMP CONT3NOTSET INC @WFLAG * SET THE WINDOW FLAG; LI R0,>1F00 * POINT TO SAL ADDRESS IN VDP< MOV @SPRTY,R1 * Y COORDINATE OF SPRITE IN R16 BLWP @VSBW * ACTIVATE WINDOW SPRITE JMP CONT9NXTK1 CB @KEY,@ASCE * CHECK IF UP ARROW PRESSED JNE NXTK2 CLR R1 LI R0,>1F00; BLWP @VSBR * READ Y COORDINATE OF SPRITE: CI R1,>FF00 * CHECK IF SPRITE AT TOP ROW JEQ CONT CLR R2 LI R3,-1* BL @SALUPD * UPDATE SAL JMP CONT;NXTK2 CB @KEY,@ASCX * CHECK IF DOWN ARROW PRESSED JNE NXTK3 CLR R1; LI R0,>1F00 * READ Y COORDINATE OF SPRITE BLWP @VSBR= CI R1,>7F00 * CHECK IF SPRITE AT BOTTOM ROW JEQ CONT CLR R2 LI R3,1 BL @SALUPD JMP CONT;NXTK3 CB @KEY,@ASCS * CHECK IF LEFT ARROW PRESSED JNE NXTK4 CLR R1 LI R0,>1F01< BLWP @VSBR * READ X COORDINATE OF SPRITEE? CI R1,0 * CHECK IF SPRITE IS AT LEFT EDGE JNE CONT1 B @CONTCONT1 LI R2,-1 CLR R3 BL @SALUPD B @CONT1F01; BLWP @VSBR * READ X COORDINATE OF SPRITE= CI R1,>C000 * CHECK IF SPRITE AT RIGHT EDGE JNE CONT2 B @CONTCONT2 LI R2,1 CLR R3 BL @SALUPD B @CONT:NXTK5 CB @KEY,@ENTER * CHECK IF ENTER KEY PRESSED JEQ CONT3NOTENT B @NXTK6;CONT3 C @WFLAG,@ONE * CHECK IF WINDOW FLAG IS SET JEQ FLAG B @CONT3FLAG INC @ZLEVEL * INCREASE ZOOM LEVEL C @ZLEVEL,@TWO JNE ZONE INC @ZFLAG1ZONE INC @ZFLAG LI R0,ZLEVEL LI R1,FAC8 BL @RADTRN * LOAD ZOOM LEVEL INTO FAC BLWP @XMLLNK9 DATA >2300 * CONVERT TO FLOATING POINT LI R0,FAC LI R1,ARG. BL @RADTRN * MOVE ZL TO ARG LI R0,FP1 LI R1,FAC1 BL @RADTRN * LOAD 1.O INTO FAC BLWP @XMLLNK$ DATA >0700 * ZL-1 LI R0,FAC LI R1,FPTMP+ BL @RADTRN * SAVE RESULT= LI R0,>1900 * POINT TO VDP RAM STORAGE AREA, LI R1,FOUR * POINT TO 4.0 LI R2,84 BLWP @VMBW * PLACE 4.0 IN VDP RAM LI R0,>19005 MOV R0,@STACK * POINT TO VDP RAM AREA CLR R0 MOVB R0,@GPLSTS( BLWP @GPLLNK * 4^(ZL-1) DATA >0024 LI R0,FAC LI R1,FPTMP1+ BL @RADTRN * SAVE RESULT LI R0,FPTMP LI R1,FAC2 BL @RADTRN * LOAD ZL-1 INTO FAC LI R0,>1900 LI R1,THREE LI R2,85 BLWP @VMBW * LOAD 3.0 INTO VDP RAM LI R0,>19000 MOV R0,@STACK * POINT TO VDP RAM CLR R0 MOVB R0,@GPLSTS BLWP @GPLLNK( DATA >0024 * 3^(ZL-1) LI R0,FAC LI R1,FPTMP2+ BL @RADTRN * SAVE RESULT. LI R0,>1F01 * POINT TO SAL+1 CLR R19 BLWP @VSBR * FETCH WINDOW X COORDINATE SWPB R1. MOV R1,@FAC * PLACE X IN FAC BLWP @XMLLNK; DATA >2300 * CONVERT X TO FLOATING POINT LI R0,FAC LI R1,FPZL2+ BL @RADTRN * SAVE RESULT LI R0,FAC LI R1,ARG/ BL @RADTRN * LOAD X INTO ARG LI R0,FPTMP1 LI R1,FAC6 BL @RADTRN * LOAD 4^(ZL-1) INTO FAC BLWP @XMLLNK, DATA >0900 * X/(4^(ZL-1)) BLWP @XMLLNK9 DATA >1200 * CONVERT RESULT TO INTEGER) A @GX,@FAC * GX+RESULT2 MOV @FAC,@ZX0 * SAVE RESULT IN ZX0 LI R0,FPZL2 LI R1,FAC/ BL @RADTRN * LOAD X INTO FAC LI R0,FP64 LI R1,ARG2 BL @RADTRN * LOAD 64.0 INTO ARG BLWP @XMLLNK$ DATA >0600 * X+64 LI R0,FAC LI R1,ARG6 BL @RADTRN * TRANSFER RESULT TO ARG LI R0,FPTMP1 LI R1,FAC6 BL @RADTRN * LOAD 4^(ZL-1) INTO FAC BLWP @XMLLNK1 DATA >0900 * (X+64)/(4^(ZL-1)) BLWP @XMLLNK9 DATA >1200 * CONVERT RESULT TO INTEGER) A @GX,@FAC * GX+RESULT4 MOV @FAC,@ZX1 * SAVE RESULT INTO ZX1/ MOV @ZX0,@GX * PLACE ZX0 IN GX, LI R0,>1F00 * POINT TO SAL CLR R19 BLWP @VSBR * FETCH WINDOW Y COORDINATE SWPB R1C CI R1,>00FF * CHECK IF SPRITE IS AT TOP OF SCREEN JNE ADD1 CLR R1 JMP CONT4ADD1 INC R1CONT4 MOV R1,@FAC BLWP @XMLLNK; DATA >2300 * CONVERT Y TO FLOATING POINT LI R0,FAC LI R1,FPZL2& BL @RADTRN * SAVE Y LI R0,FAC LI R1,ARG/ BL @RADTRN * LOAD Y INTO ARG LI R0,FPTMP2 LI R1,FAC6 BL @RADTRN * LOAD 3^(ZL-1) INTO FAC BLWP @XMLLNK, DATA >0900 * Y/(3^(ZL-1)) BLWP @XMLLNK9 DATA >1200 * CONVERT RESULT TO INTEGER) A @GY,@FAC * GY+RESULT4 MOV @FAC,@ZY0 * SAVE RESULT INTO ZY0 LI R0,FPZL2 LI R1,FAC/ BL @RADTRN * LOAD Y INTO FAC LI R0,FP64 LI R1,ARG2 BL @RADTRN * LOAD 64.0 INTO ARG BLWP @XMLLNK$ DATA >0600 * 64+Y LI R0,FAC LI R1,ARG2 BL @RADTRN * MOVE RESULT TO ARG LI R0,FPTMP2 LI R1,FAC6 BL @RADTRN * LOAD 3^(ZL-1) INTO FAC BLWP @XMLLNK1 DATA >0900 * (Y+64)/(3^(ZL-1)) BLWP @XMLLNK9 DATA >1200 * CONVERT RESULT TO INTEGER) A @GY,@FAC * GY+RESULT4 MOV @FAC,@ZY1 * SAVE RESULT INTO ZY10 MOV @ZY0,@GY * MOVE ZY0 INTO GY, LI R0,>1F00 * POINT TO SAL CLR R18 BLWP @VSBR * READ WINDOW Y COORDINATE- MOV R1,@SPRTY * SAVE WINDOW Y, LI R0,>1F00 * POINT TO SAL LI R1,>D000 */ BLWP @VSBW * TURN WINDOW OFF5 CLR @WFLAG * CLEAR THE WINDOW FLAG= LI R0,>07F1 * SET BACKGROUND COLOR TO BLACK BLWP @VWTR, CLR R0 * POINT TO PDT CLR R1- LI R2,>1800 * LENGTH OF PDT1PDTST BLWP @VSBW * CLEAR BYTE IN PDT- INC R0 * NEXT PDT BYTEA DEC R2 * KEEP TRACK OF REMAINING PDT BYTES, JNE PDTST * CLEAR SCREEN LI R0,FCNST1 LI R1,X0 BL @RADTRN * RESTORE X TO 0.5 LI R0,FCNST1 LI R1,Y0 BL @RADTRN * RESTORE Y TO 0.5 B @REDO5NXTK6 CB @KEY,@ASCB * CHECK IF B IS PRESSED JNE NXTK7 C @ZLEVEL,@ONE JHE UNZM B @CONTUNZM C @ZLEVEL,@DEC3 JLE UNZM1 B @CONT6UNZM1 DEC @ZLEVEL * BACK UP ONE ZOOM LEVEL C @ZLEVEL,@ONE JHE NOTZER CLR @ZX0 CLR @ZY0 LI R0,255 MOV R0,@ZX1 LI R0,191 MOV R0,@ZY1NOTZER B @GETDATNXTK7 CB @KEY,@ASCF JNE NXTK8 C @ZFLAG,@ONE JHE UZOOM B @CONTUZOOM C @ZLEVEL,@TWO JLT UZOOM1 B @CONTUZOOM1 C @ZFLAG1,@ONE JEQ ZOOMOK C @ZLEVEL,@ONE JLT ZOOMOK B @CONTZOOMOK INC @ZLEVEL,GETDAT CLR R0 * POINT TO PDT CLR R1- LI R2,>1800 * LENGTH OF PDT1PDTST1 BLWP @VSBW * CLEAR BYTE IN PDT- INC R0 * NEXT PDT BYTEA DEC R2 * KEEP TRACK OF REMAINING PDT BYTES JNE PDTST1, CLR R0 * POINT TO PDT6 MOV @ZLEVEL,R2 * PLACE ZOOM LEVEL IN R28 SLA R2,1 * MULTIPLY ZOOM LEVEL BY 2K MOV @SAVLOC(R2),R1 * LOAD R1 WITH THE LOCATION OF THE SAVED DATA- LI R2,>1800 * LENGTH OF PDT+ BLWP @VMBW * RESTORE PDT MOV @ZLEVEL,R2 SLA R2,1* MOV @GXDAT(R2),@GX * RESTORE GX MOV @GYDAT(R2),@GY B @CONT2NXTK8 CB @KEY,@ASCQ * CHECK IF Q PRESSED JEQ QUIT B @CONT4QUIT BLWP @0 * QUIT TO START SCREENP********************************************************************************'** RADIX 100 NUMBER TRANSFER ROUTINE **D* R0 HAS ADDRESS OF NUMBER TO TRANSFER, R1 HAS DESTINATION ADDRESS *3RADTRN MOV R11,@SUBRTN * SAVE RETURN ADDRESS CLR R27NEXT MOVB *R0+,*R1+ * MOVE BYTE FROM R0 TO R1 INC R2G CI R2,8 * THERE ARE 8 BYTES IN RADIX 100 NOTATION JLT NEXT MOV @SUBRTN,R11 B *R11P********************************************************************************** PIXEL PLOT ROUTINE **$** R8 HAS X VALUE, R9 HAS Y VALUE **PLOT MOV R8,R0 MOV R9,R13 MOV R1,R4 * R1 CONTAINS Y VALUE SLA R4,5 SOC R1,R4 ANDI R4,>FF073 MOV R0,R5 * R0 CONTAINS X VALUE ANDI R5,78 A R0,R4 * R4 IS BYTE OFFSET IN PDT7 S R5,R4 * R5 IS BIT OFFSET IN PDT MOV R4,R0O BLWP @VSBR * PDT IS AT >0000.READ BYTE @ OFFSET.RESULT IN R16 MOVB @M(R5),R2 * SELECT PIXEL TO BE LITC SOC R2,R1 * OR PIXEL LOCATION WITH CURRENT BYTE6 BLWP @VSBW * WRITE BYTE BACK TO PDT RTP********************************************************************************** KEY INPUT ROUTINE **KEYINP CLR R05 MOVB R0,@GPLSTS * CLEAR GPL STATUS BYTE0 MOVB R0,@KEYADR * CLEAR KEY BUFFER4 BLWP @KSCAN * CALL KEYSCAN ROUTINE1 LIMI 2 * ENABLE INTERRUPTS2 LIMI 0 * DISABLE INTERRUPTS RTP********************************************************************************"* SAL COORDINATES UPDATE ROUTINE *&** R2 HAS X OFFSET, R3 HAS Y OFFSET **3SALUPD LI R0,>1F00 * POINT TO SAL IN VDP: BLWP @VSBR * READ Y COORDINATE FROM SAL SWPB R2 SWPB R3 CLR R4REPEAT AB R3,R1: BLWP @VSBW * UPDATE Y COORDINATE IN SAL INC R0: BLWP @VSBR * READ X COORDINATE FROM SAL AB R2,R1: BLWP @VSBW * UPDATE X COORDINATE IN SAL7 AI R0,3 * POINT TO NEXT SAL ENTRY? BLWP @VSBR * READ NEXT Y COORDINATE FROM SAL INC R4 CI R4,12 JLT REPEAT RTP********************************************************************************* DATA *+SALDAT BYTE >53,>4C,>00,>06,>53,>54,>01,>06+ BYTE >53,>7C,>01,>06,>53,>84,>02,>06+ BYTE >5B,>84,>03,>06,>83,>84,>03,>06+ BYTE >8B,>84,>04,>06,>8B,>7C,>05,>06+ BYTE >8B,>54,>05,>06,>8B,>4C,>06,>06+ BYTE >83,>4C,>07,>06,>5B,>4C,>07,>06 BYTE >D0+SPRITE BYTE >FF,>80,>80,>80,>80,>80,>80,>80+ BYTE >FF,>00,>00,>00,>00,>00,>00,>00+ BYTE >FF,>01,>01,>01,>01,>01,>01,>01+ BYTE >01,>01,>01,>01,>01,>01,>01,>01+ BYTE >01,>01,>01,>01,>01,>01,>01,>FF+ BYTE >00,>00,>00,>00,>00,>00,>00,>FF+ BYTE >80,>80,>80,>80,>80,>80,>80,>FF+ BYTE >80,>80,>80,>80,>80,>80,>80,>80P******************************************************************************** END  AAA AAA"A*BBBBBBBBBBBBBBBF AHBSB@B BBBBBBBBBBBBBWEBXSBDBBFQB B ?B(BBF AxB@B2BBB@BBBBABFBBBAB[BBB@B2BBB?B(BBF AB?B BBB>BBBBBBBB@BBBB@BBBB@B BBF AB@B@BBBCBhaBosB DBemBonBstBraBtiBonB -B LBogBisBtiBc BEqBuaBtiBonF ABByB WBalBidB MBaaBloBulBi B- BOcBtoBbeBr B20B10BPrBesBs BSpBacBe BKeBy F A8BToB CBonBtiBnuBeBBB BBBB CJBBBBBBB CRBBF AhB1B CbBBBBB BBBBBBxBCBB'B BBBBCF ABB B CBBBC(BBB CBC B BuCoBBBBBB ClF ABBtBBBBBBB CBBB CBBB CBBB CBB>F AB CBBB CBBBC C6BbC*BBBB F AXBBC B BuCfBB CRC`BBCRBBBB BBCHBBBBF AB CBBCRBBB`CHB CBB BuCgBBBBB CzBBBF ABBBBC BB BuChBBBBB CBBBBBBBC BF AB BuCiBBBBB CBBBB`CZBBBBC B`CZB BuCjF ABBBBB CBBBB`CZBBBBC B`CZB BuCnBB`C F AHB CRC`BB`CZBC\BCTB C\CbBBCXBCVBCZBC\BBJF AxBC B CB#BBJBCBC BBJBB\BC BCBBJBC B F AC~BBBJBC BC BCBBJBC BCBB\BC B CBBF ABJBCBC BC BBJBC BBBCBBB C.BBBBnBF ABB|B BB$BBJBCBC BC BBJBC BBBCBBB F A8CBBBBnBBB|B CB$BBJBCBC BBBB C"BBF AhBJB CB#BBJBC BC BBJBB\BC BCBBJBC B ClF AB B CBB CBJF AXB BJCBBC BBJBC BCBB\BC B CNBBBJBB\BC F ABCBBJBC B CxB B CBB C>BJB BJCFB CBC>BCBF ABJBC BBBCBBB C8BBBBnBBB|B CJB$BBJBF ACBC BCBBJBC BBBCBBB CBBBBnBBB|F A B CB$BBJBCBC BBBB CBCHBBBBB CBCRF A HBBB CBBBBB C BBBBBC^BCBCyBC BCBF A xCqBC B CZC`BBCZB`CB`CZB BuCkB%B C\C`BB`CZB F A C\CdBB`CZB C\BCBBJBC BCBB\BC B CBBBJF A BCBC B`C FB BuClBUB CVC`BB`CZB C\CbBB`CZB CXF A C`BB C\C`BB`CZBC\BCBBJBC BCBB\BC B C F A 8BBBJBCBC BBBBB C ZBBBBBC\B BbC*BBF A hB C BC\B B"C0CBC@BCDBCBBCFBCTB`C bB F A BuCmBB`CZB BB CBBpBBBBBCB[BBIBB TBBDF A BB@BEBBBaBB C 2BХCJBBB C PB[B CBB|B BBBBF A BBBB`BuBBCB[BBB C BBBBCB C BB C BBB F A (C B BB C "BBB BB[BSLBBSTBBS|BBSBB[BBBBBF A XB|BBTBBLBBLBB[LBBBBBBBBBBBBBBBF A BBBBBBBBBBBBBBBBBBBF 5DSTART 3 NVWTR 3 (VSBW 3 jVMBW 3 0VSBR F 3XVMBR 3 6XMLLNK3 GPLLNK3 KSCAN F : 99/4 AS 0065: 99/4 AS 0066****************************** CHAOS DEMONSTRATION USING ** THE LOGISTIC EQUATION ** P=R*P*(1-P) ** BY WALID MAALOULI ** OCTOBER 2010 ****************************** DEF START+ REF VWTR,VSBW,VMBW,VSBR,VMBR,XMLLNK REF GPLLNK,KSCANGPLSTS EQU >837CKEYADR EQU >8374KEY EQU >8375:FAC EQU >834A * FLOATING POINT ACCUMULATOR7ARG EQU >835C * FLOATING POINT ARGUMENT2STACK EQU >836E * POINTER TO VDP RAM9SUBRTN BSS 2 * SUBROUTINE RETURN ADDRESS FPZL1 BSS 8 FPZL2 BSS 8 FPTMP1 BSS 8 FPTMP2 BSS 8 FPTMP3 BSS 8SAVLOC DATA >B000,>C800,>E000GXDAT DATA 0,0,0GYDAT DATA 0,0,0 GX DATA 0 GY DATA 0 ZX0 DATA 0 ZY0 DATA 0 ZX1 DATA 0 ZY1 DATA 0;SPRTY DATA >5300 * INITIAL WINDOW Y COORDINATE#M DATA >8040,>2010,>0804,>0201+WFLAG DATA >0000 * WINDOW FLAG:PFLAG DATA >0000 * CALCULATIONS PROGRESS FLAG)ZFLAG DATA >0000 * ZOOM FLAG1ZFLAG1 DATA >0000 * ZOOM LEVEL 2 FLAG.EFLAG DATA >0000 * ENTER KEY FLAG*ZLEVEL DATA >0000 * ZOOM LEVEL7COUNT1 DATA >0000 * CALCULATIONS ITERATIONSONE DATA >0001TWO DATA >0002DEC3 DATA >0003'ASCW BYTE >57 * ASCII W'ASCE BYTE >45 * ASCII E'ASCX BYTE >58 * ASCII X'ASCS BYTE >53 * ASCII S'ASCD BYTE >44 * ASCII D'ASCB BYTE >42 * ASCII B'ASCF BYTE >46 * ASCII F'ASCQ BYTE >51 * ASCII Q+ENTER BYTE >0D * KEY+SPACE BYTE >20 * KEYANYKEY BYTE >20BP BYTE >3F,>28,>00,>00,>00,>00,>00,>00 * 0.4 - INITIAL VALUEBR BYTE >40,>02,>32,>00,>00,>00,>00,>00 * 2.5 - INITIAL VALUE2FP1 BYTE >40,>01,>00,>00,>00,>00,>00,>00 * 1.04FP170 BYTE >41,>01,>46,>00,>00,>00,>00,>00 * 170.04FP191 BYTE >41,>01,>5B,>00,>00,>00,>00,>00 * 191.02FCONST BYTE >40,>02,>32,>00,>00,>00,>00,>00 * 2.52FCNST BYTE >3F,>28,>00,>00,>00,>00,>00,>00 * 0.42FCNST1 BYTE >3F,>0A,>00,>00,>00,>00,>00,>00 * 0.1ECOEF BYTE >3E,>01,>00,>00,>00,>00,>00,>00 * 0.0001 - INITIAL VALUE3NEGONE BYTE >BF,>FF,>00,>00,>00,>00,>00,>00 * -1.02THREE BYTE >40,>03,>00,>00,>00,>00,>00,>00 * 3.02FOUR BYTE >40,>04,>00,>00,>00,>00,>00,>00 * 4.03FP10 BYTE >40,>0A,>00,>00,>00,>00,>00,>00 * 10.03FP64 BYTE >40,>40,>00,>00,>00,>00,>00,>00 * 64.05TITLE TEXT 'Chaos Demonstration - Logistic Equation'.CREDIT TEXT 'By Walid Maalouli - October 2010')PRESSK TEXT 'Press Space Key To Continue' EVENSTART LI R0,>02004 BLWP @VWTR * RESTORE SIT TO >0000 LI R0,>04013 BLWP @VWTR * RESTORE PDT TO >8009 LI R0,>F000 * VALUE TO BE LOADED IN VR1K MOVB R0,@>83D4 * SAVE VALUE IN >83D4 (INTERPRETER WORKSPACE)8 LI R0,>01F0 * SELECTS TEXT MODE IN VR1/ BLWP @VWTR * START TEXT MODE CLR R09 LI R0,>0731 * SET COLORS GREEN ON BLACK BLWP @VWTR, CLR R0 * POINT TO SIT CLR R1A LI R2,960 * 960 SCREEN POSITIONS IN TEXT MODE5LOOP BLWP @VSBW * CLEAR SCREEN POSITION= INC R0 * POINT TO NEXT SCREEN POSITION DEC R2I JNE LOOP * REPEAT UNTIL ALL SCREEN POSITIONS CLEARED? LI R0,>78 * LOAD TEXT SCREEN LOCATION IN R04 LI R1,TITLE * POINT TO TEXT STRING0 LI R2,39 * LENGTH OF STRING4 BLWP @VMBW * PLACE TEXT ON SCREEN LI R0,>F4 LI R1,CREDIT LI R2,32 BLWP @VMBW LI R0,>286 LI R1,PRESSK LI R2,27 BLWP @VMBWNOTSPC BL @KEYINP CB @KEY,@SPACE JNE NOTSPC7 INC @>83D6 * DISABLE SCREEN BLANKING= LI R0,>07F1 * SET BACKGROUND COLOR TO BLACK BLWP @VWTR6 CLR @KEYADR * SELECT ENTIRE KEYBOARD* INITIALIZE BITMAP MODE LI R0,>A000D MOVB R0,@>83D4 * PLACE VALUE IN INTERPRETER WORKSPACE> LI R0,>01A0 * SELECT VR1 AND NEW VALUE (>A0), BLWP @VWTR * BLANK SCREEN LI R0,>02074 BLWP @VWTR * SIT ADDRESS AT >1C00 LI R0,>04034 BLWP @VWTR * PDT ADDRESS AT >0000 LI R0,>03FF3 BLWP @VWTR * CT ADDRESS AT >2000 LI R0,>053E> BLWP @VWTR * SPRITE ATTRIBUTE LIST AT >1F00 LI R0,>0603@ BLWP @VWTR * SPRITE DEFINITION TABLE AT >1800) LI R0,>1F00 * POINT SAL1 LI R1,SALDAT * POINT TO SAL DATA; LI R2,49 * NUMBER OF BYTES IN SAL DATA2 BLWP @VMBW * LOAD SAL WITH DATA, LI R0,>1F00 * POINT TO SAL LI R1,>D000B BLWP @VSBW * MARK SAL AS INVALID (BLANK SPRITE), LI R0,>1800 * POINT TO SDT? LI R1,SPRITE * POINT TO SPRITE DEFINITION DATAD LI R2,64 * NUMBER OF BYTES IN SPRITE DEFINITION> BLWP @VMBW * PLACE SPRITE DEFINITION IN SDT: LI R0,>1C00 * SIT INITIALIZATION ROUTINE CLR R15 LI R2,3 * THREE SECTIONS TO SIT>SITINI BLWP @VSBW * PLACE HIGH BYTE OF R1 INTO SIT- INC R0 * NEXT SIT BYTE9 AI R1,>100 * INCREMENT HIGH BYTE OF R1: JNE SITINI * R1 WILL GO FROM >00 TO >FF1 DEC R2 * SIT SECTION COUNT JNE SITINI+ LI R0,>2000 * POINT TO CT> LI R1,>E100 * DEFINE COLORS AS GRAY ON BLACK, LI R2,>1800 * LENGTH OF CT?CTSET BLWP @VSBW * WRITE COLOR BYTE TO CT POSITION, INC R0 * NEXT CT BYTE@ DEC R2 * KEEP TRACK OF REMAINING CT BYTES> JNE CTSET * REPEAT UNTIL END OF CT REACHED5 CLR R0 * START OF PDT IS >0000 CLR R1- LI R2,>1800 * LENGTH OF PDT1PDTSET BLWP @VSBW * CLEAR BYTE IN PDT- INC R0 * NEXT PDT BYTEA DEC R2 * KEEP TRACK OF REMAINING PDT BYTES? JNE PDTSET * REPEAT INTIL END OF PDT REACHED6 LI R0,2 * SELECT VR0 AND VALUE 21 BLWP @VWTR * START BITMAP MODE6 LI R0,>E000 * VALUE TO BE PUT IN VR1? MOVB R0,@>83D4 * SAVE INTO INTERPRETER WORKSPACE8 LI R0,>01E0 * SELECT VR1 AND VALUE >E0. BLWP @VWTR * TURN SCREEN ON* BEGIN CALCULATIONSREDO LI R0,P LI R1,FAC/ BL @RADTRN * LOAD P INTO FAC LI R0,FP1 LI R1,ARG2 BL @RADTRN * LOAD FP 1 INTO ARG BLWP @XMLLNK# DATA >0700 * 1-P LI R0,FAC LI R1,ARG8 BL @RADTRN * TRANSFER RESULT INTO ARG LI R0,P LI R1,FAC/ BL @RADTRN * LOAD P INTO FAC BLWP @XMLLNK' DATA >0800 * P*(1-P) LI R0,FAC LI R1,ARG8 BL @RADTRN * TRANSFER RESULT INTO ARG LI R0,R LI R1,FAC/ BL @RADTRN * LOAD R INTO FAC BLWP @XMLLNK) DATA >0800 * R*P*(1-P) LI R0,FAC LI R1,P2 BL @RADTRN * SAVE RESULT INTO P LI R0,FCONST LI R1,FAC1 BL @RADTRN * LOAD 2.5 INTO FAC LI R0,R LI R1,ARG/ BL @RADTRN * LOAD R INTO ARG BLWP @XMLLNK% DATA >0700 * R-2.5 LI R0,FAC LI R1,FPTMP3+ BL @RADTRN * SAVE RESULT LI R0,FAC LI R1,ARG8 BL @RADTRN * TRANSFER RESULT INTO ARG LI R0,FP170 LI R1,FAC4 BL @RADTRN * LOAD FP 170 INTO FAC BLWP @XMLLNK+ DATA >0800 * (R-2.5)*170 BLWP @XMLLNK9 DATA >1200 * CONVERT RESULT TO INTEGER3 MOV @FAC,R8 * SAVE RESULT INTO R8 LI R0,FP191 LI R1,FAC4 BL @RADTRN * LOAD FP 191 INTO FAC LI R0,P LI R1,ARG/ BL @RADTRN * LOAD P INTO ARG BLWP @XMLLNK% DATA >0800 * P*191 LI R0,FP191 LI R1,ARG3 BL @RADTRN * LOAD 191.0 INTO ARG BLWP @XMLLNK+ DATA >0700 * 191-(P*191) BLWP @XMLLNK9 DATA >1200 * CONVERT RESULT TO INTEGER3 MOV @FAC,R9 * SAVE RESULT INTO R90 C @ZLEVEL,@ONE * CHECK ZOOM LEVEL JHE ZOOM B @NOZOOMZOOM C R8,@ZX0= JLE NOTRNG * CHECK IF X < WINDOW LEFT EDGE C R8,@ZX1> JLT INRNG * CHECK IF X > WINDOW RIGHT EDGE B @SAVE C R9,@ZY0> JLE NOTRNG * CHECK IF Y < WINDOW UPPER EDGE C R9,@ZY1> JLT INRNG * CHECK IF Y > WINDOW LOWER EDGENOTRNG B @NXTPXLINRNG LI R0,FPTMP3 LI R1,FAC4 BL @RADTRN * PLACE R-2.5 INTO FAC LI R0,FP1704 LI R1,ARG * PLACE 170.0 INTO ARG BL @RADTRN BLWP @XMLLNK+ DATA >0800 * (R-2.5)*170 LI R0,FAC LI R1,ARG6 BL @RADTRN * TRANSFER RESULT TO ARG LI R0,ZX0 LI R1,FAC2 BL @RADTRN * PLACE ZX0 INTO FAC BLWP @XMLLNK8 DATA >2300 * CONVERT TO FLATING POINT BLWP @XMLLNK2 DATA >0700 * ((R-2.5)*170)-ZX0) LI R0,FPTMP1 LI R1,ARG3 BL @RADTRN * PLACE 4^ZL INTO ARG BLWP @XMLLNK8 DATA >0800 * (((R-2.5)*170)-ZX0)*4^ZL BLWP @XMLLNK9 DATA >1200 * CONVERT RESULT TO INTEGER4 MOV @FAC,R8 * PLACE RESULT INTO R8C CI R8,255 * CHECK IF X BEYOND RIGHT SCREEN EDGE JLE GOTOY9 JMP NXTPXL * IF IT IS, THEN SKIP PIXELGOTOY LI R0,P LI R1,FAC0 BL @RADTRN * PLACE P INTO FAC LI R0,FP191 LI R1,ARG4 BL @RADTRN * PLACE 191.0 INTO ARG BLWP @XMLLNK% DATA >0800 * P*191 LI R0,FP191 LI R1,ARG4 BL @RADTRN * PLACE 191.0 INTO ARG BLWP @XMLLNK+ DATA >0700 * 191-(P*191) LI R0,FAC LI R1,ARG6 BL @RADTRN * TRANSFER RESULT TO ARG LI R0,ZY0 LI R1,FAC2 BL @RADTRN * PLACE ZY0 INTO FAC BLWP @XMLLNK9 DATA >2300 * CONVERT TO FLOATING POINT BLWP @XMLLNK1 DATA >0700 * (191-(P*191))-ZY0 LI R0,FPTMP2 LI R1,ARG3 BL @RADTRN * PLACE 3^ZL INTO ARG BLWP @XMLLNK8 DATA >0800 * ((191-(P*191))-ZY0)*3^ZL BLWP @XMLLNK9 DATA >1200 * CONVERT RESULT TO INTEGER4 MOV @FAC,R9 * PLACE RESULT INTO R9G CI R9,191 * CHECK IF Y COORDINATE BELOW SCREEN EDGE8 JLE NOZOOM * IF IT IS THEN SKIP PIXELNXTPXL LI R0,R LI R1,FAC/ BL @RADTRN * LOAD R INTO FAC LI R0,COEF LI R1,ARG2 BL @RADTRN * LOAD COEF INTO ARG BLWP @XMLLNK& DATA >0600 * R+COEF LI R0,FAC LI R1,R8 BL @RADTRN * PLACE RESULT BACK INTO R C @ZLEVEL,@ONE JLT CHKITR= C @PFLAG,@ONE * CHECK IF PROGRESS FLAG IS SET JEQ CHKITR BL @PLOT JMP CHKITRNOZOOM C @ZLEVEL,@ONE JLT PRGSET C @PFLAG,@ONE JEQ PRGSET, CLR R0 * POINT TO PDT CLR R1 LI R2,>1800,PDTST2 BLWP @VSBW * CLEAR SCREEN INC R0 DEC R2 JNE PDTST25 INC @PFLAG * SET THE PROGRESS FLAG-PRGSET BL @PLOT * DISPLAY PIXEL LI R0,R LI R1,FAC/ BL @RADTRN * LOAD R INTO FAC LI R0,COEF LI R1,ARG2 BL @RADTRN * LOAD COEF INTO ARG BLWP @XMLLNK& DATA >0600 * R+COEF LI R0,FAC LI R1,R2 BL @RADTRN * SAVE RESULT INTO R C @ZLEVEL,@ONE JHE CHKITR INC @COUNT1 MOV @COUNT1,R0E CI R0,15000 * FOR ZOOM LEVEL 0, DO 15000 ITERATIONS JGT SAVECHKITR B @REDOSAVE C @ZLEVEL,@TWO JH CONT8 MOV @ZLEVEL,R2 * PLACE ZOOM LEVEL INTO R28 SLA R2,1 * MULTIPLY ZOOM LEVEL BY 2' MOV @GX,@GXDAT(R2) * SAVE GX' MOV @GY,@GYDAT(R2) * SAVE GYJ MOV @SAVLOC(R2),R1 * PLACE THE CPU MEMORY SAVE LOCATION INTO R1, CLR R0 * POINT TO PDT6 LI R2,>1800 * NUMBER OF BYTES IN PDT3 BLWP @VMBR * SAVE PDT IN CPU RAMCONT BL @KEYINP2 CB @KEY,@ASCW * CHECK IF W PRESSED JNE NXTK1? C @WFLAG,@ONE * CHECK IF THE WINDOW FLAG IS SET JNE NOTSET CLR @WFLAG; LI R0,>1F00 * POINT TO SAL ADDRESS IN VDP CLR R1? BLWP @VSBR * PLACE WINDOW Y COORDINATE IN R18 MOV R1,@SPRTY * SAVE WINDOW Y COORDINATE; LI R0,>1F00 * POINT TO SAL ADDRESS IN VDP LI R1,>D0003 BLWP @VSBW * CLEAR WINDOW SPRITE JMP CONT3NOTSET INC @WFLAG * SET THE WINDOW FLAG; LI R0,>1F00 * POINT TO SAL ADDRESS IN VDP< MOV @SPRTY,R1 * Y COORDINATE OF SPRITE IN R16 BLWP @VSBW * ACTIVATE WINDOW SPRITE JMP CONT9NXTK1 CB @KEY,@ASCE * CHECK IF UP ARROW PRESSED JNE NXTK2 CLR R1 LI R0,>1F00; BLWP @VSBR * READ Y COORDINATE OF SPRITE: CI R1,>FF00 * CHECK IF SPRITE AT TOP ROW JEQ CONT CLR R2 LI R3,-1* BL @SALUPD * UPDATE SAL JMP CONT;NXTK2 CB @KEY,@ASCX * CHECK IF DOWN ARROW PRESSED JNE NXTK3 CLR R1; LI R0,>1F00 * READ Y COORDINATE OF SPRITE BLWP @VSBR= CI R1,>7F00 * CHECK IF SPRITE AT BOTTOM ROW JEQ CONT CLR R2 LI R3,1 BL @SALUPD JMP CONT;NXTK3 CB @KEY,@ASCS * CHECK IF LEFT ARROW PRESSED JNE NXTK4 CLR R1 LI R0,>1F01< BLWP @VSBR * READ X COORDINATE OF SPRITEE? CI R1,0 * CHECK IF SPRITE IS AT LEFT EDGE JNE CONT1 B @CONTCONT1 LI R2,-1 CLR R3 BL @SALUPD B @CONT1F01; BLWP @VSBR * READ X COORDINATE OF SPRITE= CI R1,>C000 * CHECK IF SPRITE AT RIGHT EDGE JNE CONT2 B @CONTCONT2 LI R2,1 CLR R3 BL @SALUPD B @CONT:NXTK5 CB @KEY,@ENTER * CHECK IF ENTER KEY PRESSED JEQ CONT3NOTENT B @NXTK6;CONT3 C @WFLAG,@ONE * CHECK IF WINDOW FLAG IS SET JEQ FLAG B @CONT3FLAG INC @ZLEVEL * INCREASE ZOOM LEVEL3 CLR @PFLAG * CLEAR PROGRESS FLAG C @ZLEVEL,@TWO JNE ZONE INC @ZFLAG1ZONE INC @ZFLAG INC @EFLAG LI R0,ZLEVEL LI R1,FAC8 BL @RADTRN * LOAD ZOOM LEVEL INTO FAC BLWP @XMLLNK9 DATA >2300 * CONVERT TO FLOATING POINT LI R0,FAC LI R1,FPZL1' BL @RADTRN * SAVE ZL LI R0,FAC LI R1,ARG. BL @RADTRN * MOVE ZL TO ARG LI R0,FP1 LI R1,FAC1 BL @RADTRN * LOAD 1.O INTO FAC BLWP @XMLLNK$ DATA >0700 * ZL-1 LI R0,FAC LI R1,FPZL2* BL @RADTRN * STORE ZL-1 LI R0,FCNST1 LI R1,FAC2 BL @RADTRN * PLACE 0.1 INTO FAC LI R0,COEF LI R1,ARG3 BL @RADTRN * PLACE COEF INTO ARG BLWP @XMLLNK( DATA >0800 * COEF*0.1 LI R0,FAC LI R1,COEF+ BL @RADTRN * UPDATE COEF LI R0,FPZL2 LI R1,FAC2 BL @RADTRN * LOAD ZL-1 INTO FAC= LI R0,>1900 * POINT TO VDP RAM STORAGE AREA, LI R1,FOUR * POINT TO 4.0 LI R2,84 BLWP @VMBW * PLACE 4.0 IN VDP RAM LI R0,>19005 MOV R0,@STACK * POINT TO VDP RAM AREA CLR R0 MOVB R0,@GPLSTS( BLWP @GPLLNK * 4^(ZL-1) DATA >0024 LI R0,FAC LI R1,FPTMP1+ BL @RADTRN * SAVE RESULT LI R0,FPZL2 LI R1,FAC2 BL @RADTRN * LOAD ZL-1 INTO FAC LI R0,>1900 LI R1,THREE LI R2,85 BLWP @VMBW * LOAD 3.0 INTO VDP RAM LI R0,>19000 MOV R0,@STACK * POINT TO VDP RAM CLR R0 MOVB R0,@GPLSTS BLWP @GPLLNK( DATA >0024 * 3^(ZL-1) LI R0,FAC LI R1,FPTMP2+ BL @RADTRN * SAVE RESULT. LI R0,>1F01 * POINT TO SAL+1 CLR R19 BLWP @VSBR * FETCH WINDOW X COORDINATE SWPB R1. MOV R1,@FAC * PLACE X IN FAC BLWP @XMLLNK; DATA >2300 * CONVERT X TO FLOATING POINT LI R0,FAC LI R1,FPZL2+ BL @RADTRN * SAVE RESULT LI R0,FAC LI R1,ARG/ BL @RADTRN * LOAD X INTO ARG LI R0,FPTMP1 LI R1,FAC6 BL @RADTRN * LOAD 4^(ZL-1) INTO FAC BLWP @XMLLNK, DATA >0900 * X/(4^(ZL-1)) BLWP @XMLLNK9 DATA >1200 * CONVERT RESULT TO INTEGER) A @GX,@FAC * GX+RESULT2 MOV @FAC,@ZX0 * SAVE RESULT IN ZX0 LI R0,FPZL2 LI R1,FAC/ BL @RADTRN * LOAD X INTO FAC LI R0,FP64 LI R1,ARG2 BL @RADTRN * LOAD 64.0 INTO ARG BLWP @XMLLNK$ DATA >0600 * X+64 LI R0,FAC LI R1,ARG6 BL @RADTRN * TRANSFER RESULT TO ARG LI R0,FPTMP1 LI R1,FAC6 BL @RADTRN * LOAD 4^(ZL-1) INTO FAC BLWP @XMLLNK1 DATA >0900 * (X+64)/(4^(ZL-1)) BLWP @XMLLNK9 DATA >1200 * CONVERT RESULT TO INTEGER) A @GX,@FAC * GX+RESULT4 MOV @FAC,@ZX1 * SAVE RESULT INTO ZX1/ MOV @ZX0,@GX * PLACE ZX0 IN GX, LI R0,>1F00 * POINT TO SAL CLR R19 BLWP @VSBR * FETCH WINDOW Y COORDINATE SWPB R1C CI R1,>00FF * CHECK IF SPRITE IS AT TOP OF SCREEN JNE ADD1 CLR R1 JMP CONT4ADD1 INC R1CONT4 MOV R1,@FAC BLWP @XMLLNK; DATA >2300 * CONVERT Y TO FLOATING POINT LI R0,FAC LI R1,FPZL2& BL @RADTRN * SAVE Y LI R0,FAC LI R1,ARG/ BL @RADTRN * LOAD Y INTO ARG LI R0,FPTMP2 LI R1,FAC6 BL @RADTRN * LOAD 6^(ZL-1) INTO FAC BLWP @XMLLNK, DATA >0900 * Y/(3^(ZL-1)) BLWP @XMLLNK9 DATA >1200 * CONVERT RESULT TO INTEGER) A @GY,@FAC * GY+RESULT4 MOV @FAC,@ZY0 * SAVE RESULT INTO ZY0 LI R0,FPZL2 LI R1,FAC/ BL @RADTRN * LOAD Y INTO FAC LI R0,FP64 LI R1,ARG2 BL @RADTRN * LOAD 64.0 INTO ARG BLWP @XMLLNK$ DATA >0600 * 64+Y LI R0,FAC LI R1,ARG2 BL @RADTRN * MOVE RESULT TO ARG LI R0,FPTMP2 LI R1,FAC6 BL @RADTRN * LOAD 3^(ZL-1) INTO FAC BLWP @XMLLNK1 DATA >0900 * (Y+64)/(3^(ZL-1)) BLWP @XMLLNK9 DATA >1200 * CONVERT RESULT TO INTEGER) A @GY,@FAC * GY+RESULT4 MOV @FAC,@ZY1 * SAVE RESULT INTO ZY10 MOV @ZY0,@GY * MOVE ZY0 INTO GY LI R0,FPZL1 LI R1,FAC0 BL @RADTRN * LOAD ZL INTO FAC LI R0,>1900 LI R1,FOUR LI R2,85 BLWP @VMBW * LOAD 4.0 INTO VDP RAM LI R0,>19004 MOV R0,@STACK * POINT TO THE VDP RAM CLR R0 MOVB R0,@GPLSTS BLWP @GPLLNK$ DATA >0024 * 4^ZL LI R0,FAC LI R1,FPTMP1+ BL @RADTRN * SAVE RESULT LI R0,FPZL1 LI R1,FAC0 BL @RADTRN * LOAD ZL INTO FAC LI R0,>1900 LI R1,THREE LI R2,85 BLWP @VMBW * LOAD 3.0 INTO VDP RAM LI R0,>19004 MOV R0,@STACK * POINT TO THE VDP RAM CLR R0 MOVB R0,@GPLSTS BLWP @GPLLNK$ DATA >0024 * 3^ZL LI R0,FAC LI R1,FPTMP2+ BL @RADTRN * SAVE RESULT, LI R0,>1F00 * POINT TO SAL CLR R18 BLWP @VSBR * READ WINDOW Y COORDINATE- MOV R1,@SPRTY * SAVE WINDOW Y, LI R0,>1F00 * POINT TO SAL LI R1,>D000 */ BLWP @VSBW * TURN WINDOW OFF5 CLR @WFLAG * CLEAR THE WINDOW FLAG= LI R0,>07F1 * SET BACKGROUND COLOR TO BLACK BLWP @VWTR, CLR R0 * POINT TO PDT CLR R1- LI R2,>1800 * LENGTH OF PDT1PDTST BLWP @VSBW * CLEAR BYTE IN PDT- INC R0 * NEXT PDT BYTEA DEC R2 * KEEP TRACK OF REMAINING PDT BYTES, JNE PDTST * CLEAR SCREENRESET CLR @COUNT1 LI R0,FCONST LI R1,R. BL @RADTRN * RESET R TO 2.5 LI R0,FCNST LI R1,P. BL @RADTRN * RESET P TO 0.4 C @EFLAG,@ONE JNE OTHERK CLR @EFLAG B @REDOOTHERK B @CONT5NXTK6 CB @KEY,@ASCB * CHECK IF B IS PRESSED JNE NXTK7 C @ZLEVEL,@ONE JHE UNZM B @CONTUNZM C @ZLEVEL,@DEC3 JLE UNZM1 B @CONT6UNZM1 DEC @ZLEVEL * BACK UP ONE ZOOM LEVEL LI R0,FP103 LI R1,FAC * PLACE 10.0 INTO FAC BL @RADTRN LI R0,COEF LI R1,ARG3 BL @RADTRN * PLACE COEF INTO ARG BLWP @XMLLNK' DATA >0800 * COEF*10 LI R0,FAC LI R1,COEF3 BL @RADTRN * SAVE RESULT IN COEF B @GETDATNXTK7 CB @KEY,@ASCF JNE NXTK8 C @ZFLAG,@ONE JHE UZOOM B @CONTUZOOM C @ZLEVEL,@TWO JLT UZOOM1 B @CONTUZOOM1 C @ZFLAG1,@ONE JEQ ZOOMOK C @ZLEVEL,@ONE JLT ZOOMOK B @CONTZOOMOK INC @ZLEVEL LI R0,FCNST1 LI R1,FAC2 BL @RADTRN * PLACE 0.1 INTO FAC LI R0,COEF LI R1,ARG3 BL @RADTRN * PLACE COEF INTO ARG BLWP @XMLLNK( DATA >0800 * COEF*0.1 LI R0,FAC LI R1,COEF5 BL @RADTRN * SAVE RESULT INTO COEF,GETDAT CLR R0 * POINT TO PDT CLR R1- LI R2,>1800 * LENGTH OF PDT1PDTST1 BLWP @VSBW * CLEAR BYTE IN PDT- INC R0 * NEXT PDT BYTEA DEC R2 * KEEP TRACK OF REMAINING PDT BYTES JNE PDTST1, CLR R0 * POINT TO PDT6 MOV @ZLEVEL,R2 * PLACE ZOOM LEVEL IN R28 SLA R2,1 * MULTIPLY ZOOM LEVEL BY 2K MOV @SAVLOC(R2),R1 * LOAD R1 WITH THE LOCATION OF THE SAVED DATA- LI R2,>1800 * LENGTH OF PDT+ BLWP @VMBW * RESTORE PDT MOV @ZLEVEL,R2 SLA R2,1* MOV @GXDAT(R2),@GX * RESTORE GX MOV @GYDAT(R2),@GY CLR @ZX0 CLR @ZX1 CLR @ZY0 CLR @ZY1 CLR @PFLAG B @RESET2NXTK8 CB @KEY,@ASCQ * CHECK IF Q PRESSED JEQ QUIT B @CONT4QUIT BLWP @0 * QUIT TO START SCREENP********************************************************************************'** RADIX 100 NUMBER TRANSFER ROUTINE **D* R0 HAS ADDRESS OF NUMBER TO TRANSFER, R1 HAS DESTINATION ADDRESS *3RADTRN MOV R11,@SUBRTN * SAVE RETURN ADDRESS CLR R27NEXT MOVB *R0+,*R1+ * MOVE BYTE FROM R0 TO R1 INC R2G CI R2,8 * THERE ARE 8 BYTES IN RADIX 100 NOTATION JLT NEXT MOV @SUBRTN,R11 B *R11P********************************************************************************** PIXEL PLOT ROUTINE **$** R8 HAS X VALUE, R9 HAS Y VALUE **PLOT MOV R8,R0 MOV R9,R13 MOV R1,R4 * R1 CONTAINS Y VALUE SLA R4,5 SOC R1,R4 ANDI R4,>FF073 MOV R0,R5 * R0 CONTAINS X VALUE ANDI R5,78 A R0,R4 * R4 IS BYTE OFFSET IN PDT7 S R5,R4 * R5 IS BIT OFFSET IN PDT MOV R4,R0O BLWP @VSBR * PDT IS AT >0000.READ BYTE @ OFFSET.RESULT IN R16 MOVB @M(R5),R2 * SELECT PIXEL TO BE LITC SOC R2,R1 * OR PIXEL LOCATION WITH CURRENT BYTE6 BLWP @VSBW * WRITE BYTE BACK TO PDT RTP********************************************************************************** KEY INPUT ROUTINE **>KEYINP MOV R11,@SUBRTN * SAVE SUBROUTINE RETURN ADDRESS5SCAN CLR @GPLSTS * CLEAR GPL STATUS BYTE4 BLWP @KSCAN * CALL KEYSCAN ROUTINE1 LIMI 2 * ENABLE INTERRUPTS2 LIMI 0 * DISABLE INTERRUPTS LI R1,>FF00H CB @KEY,R1 * CHECK IF BIT 2 OF GPL STATUS BYTE IS SETH JEQ SCAN * RESCAN IF SAME KEY PRESENT IN KEY BUFFER MOV @SUBRTN,R11 B *R11P********************************************************************************"* SAL COORDINATES UPDATE ROUTINE *&** R2 HAS X OFFSET, R3 HAS Y OFFSET **3SALUPD LI R0,>1F00 * POINT TO SAL IN VDP: BLWP @VSBR * READ Y COORDINATE FROM SAL SWPB R2 SWPB R3 CLR R4REPEAT AB R3,R1: BLWP @VSBW * UPDATE Y COORDINATE IN SAL INC R0: BLWP @VSBR * READ X COORDINATE FROM SAL AB R2,R1: BLWP @VSBW * UPDATE X COORDINATE IN SAL7 AI R0,3 * POINT TO NEXT SAL ENTRY? BLWP @VSBR * READ NEXT Y COORDINATE FROM SAL INC R4 CI R4,12 JLT REPEAT RTP********************************************************************************* DATA *+SALDAT BYTE >53,>4C,>00,>06,>53,>54,>01,>06+ BYTE >53,>7C,>01,>06,>53,>84,>02,>06+ BYTE >5B,>84,>03,>06,>83,>84,>03,>06+ BYTE >8B,>84,>04,>06,>8B,>7C,>05,>06+ BYTE >8B,>54,>05,>06,>8B,>4C,>06,>06+ BYTE >83,>4C,>07,>06,>5B,>4C,>07,>06 BYTE >D0+SPRITE BYTE >FF,>80,>80,>80,>80,>80,>80,>80+ BYTE >FF,>00,>00,>00,>00,>00,>00,>00+ BYTE >FF,>01,>01,>01,>01,>01,>01,>01+ BYTE >01,>01,>01,>01,>01,>01,>01,>01+ BYTE >01,>01,>01,>01,>01,>01,>01,>FF+ BYTE >00,>00,>00,>00,>00,>00,>00,>FF+ BYTE >80,>80,>80,>80,>80,>80,>80,>FF+ BYTE >80,>80,>80,>80,>80,>80,>80,>80P******************************************************************************** END  AAA A B@B BBBBBBBBBBBBBBBBF A.BBBBBBBBBQB?(BBBBBBBB@B BBB@BFBF A^BBBBBB@BBBB@BBBB@ BBBBAB\BBB> B^ BF ABB>DBBBBBBBB@B BBB?(BBBBABBBB?2BBF ABBBBBBChBaoBs BDeBmoBnsBtrBatBioBn BUsBinBg BLyBapBunBovB SBpaF ABceBByB WBalBidB MBaaBloBulBi B- BOcBtoBbeBr B20B10BCaBlcBulBatBinBg.B..F AB>>B>>B>>B>>B>>B0%B10B0%BBB@C BBBBBBB BBBB CDF ANBBBBBBB CLBBB1B C\BBBBB BBBBBBxF A~BCBB(B BBBBCBB B CBBBCBBB CBB:F ABC(BBB CBBIBC*BBB CBBBC4B C4C:B BC4F ABCBC@BC"B`CZB`C.BCBBBBCXBCHBC"BBCPF ABCHBC"BC.B C.CB BBBC@BB\BC"B C@BBCHBB\BC"B CRBBBJBF AnC@BC"BBaC@CBBBBBB`CBCpBBJBC"BBB|B F ABB*BBJBCBC"BCpBBJBC"BCHBB\BC"B CdBBF AC@BB\BC"B CBBCHBB\BC"B CBB BJB BBB BF ACBB\BC"B CBBBB|B CB*BBJBB\BC"BCBBJF A.BC"B C B BCBB\BC"B C4BBBJBCBC"B`CBCF A^BB\BC"BCBBJBC"B CFB B BJB BBBBB C0B`C2F ABC8BC`BCBC"BCPBBJBC"BCBB\BC"B CtBBF ABJBCPBC"BC0B C0C8BB`CBCXBBJBC"BCBB\BF AC"B CBBBJBCXBC"BCBCPBC"BC6BC6BBJBC"F AB CB#BBJBB\BC"BCBBJBC"B C B BCxBB\BC"F ANB C>BB CPBBCxBC0B C2BB`CBBB CfBBtBBBF A~BBBB CrBBB CBBB CBBB CBB>B CBBB F ACBBBBB CrBBBBBB CBB!BBBBBB BBF ABBB CBBBBBB CBBBBBBB CBBC BBF AB CBC`B BuC>BB BB CBBpBBBBBCB[BBIBF A>B TBBDBB@BEBBBaBdC BХC BBBC B[BBB|BBtB BF AnBBBBB[BBJBBBBB>BCB CB[F 5.START 3VWTR 3VSBW 3VMBW 4VSBR F 4VMBR 3VXMLLNK3GPLLNK3lKSCAN F : 99/4 AS 0033****************************** CHAOS DEMONSTRATION USING ** THE LYAPUNOV SPACE ** BY WALID MAALOULI ** OCTOBER 2010 ****************************** DEF START+ REF VWTR,VSBW,VMBW,VSBR,VMBR,XMLLNK REF GPLLNK,KSCANGPLSTS EQU >837CKEYADR EQU >8374KEY EQU >8375:FAC EQU >834A * FLOATING POINT ACCUMULATOR7ARG EQU >835C * FLOATING POINT ARGUMENT9SUBRTN BSS 2 * SUBROUTINE RETURN ADDRESS FPTMP BSS 8@IMAGE BSS >1800 * STORAGE SPACE FOR LYAPUNOV SPACE#M DATA >8040,>2010,>0804,>0201#PATRN DATA 2,2,2,2,2,2,1,1,1,1,1,1ONE DATA >0001TWO DATA >0002INDEX DATA >0000SX DATA >0000SY DATA 191COUNT DATA >0000.COUNT1 DATA >0000 * GLOBAL COUNTERMAXX DATA 255MAXCNT DATA 200DEC22 DATA 22'ASCQ BYTE >51 * ASCII Q EVENBP BYTE >3F,>28,>00,>00,>00,>00,>00,>00 * 0.4 - INITIAL VALUE@R BYTE >00,>00,>00,>00,>00,>00,>00,>00 * 0 - INITIAL VALUEBRX BYTE >40,>03,>0A,>00,>00,>00,>00,>00 * 3.1 - INITIAL VALUEBRY BYTE >40,>02,>46,>00,>00,>00,>00,>00 * 2.7 - INITIAL VALUE2FPZERO BYTE >00,>00,>00,>00,>00,>00,>00,>00 * 0.02FP1 BYTE >40,>01,>00,>00,>00,>00,>00,>00 * 1.02FP2 BYTE >40,>02,>00,>00,>00,>00,>00,>00 * 2.03FP10 BYTE >40,>0A,>00,>00,>00,>00,>00,>00 * 10.04FP192 BYTE >41,>01,>5C,>00,>00,>00,>00,>00 * 192.09XADD BYTE >3E,>20,>5E,>0C,>00,>00,>00,>00 * 0.003294129YADD BYTE >3E,>44,>06,>1C,>00,>00,>00,>00 * 0.00680628@TOTAL BYTE >00,>00,>00,>00,>00,>00,>00,>00 * 0 - INITIAL VALUE2FCONST BYTE >40,>03,>0A,>00,>00,>00,>00,>00 * 3.12FCNST1 BYTE >3F,>28,>00,>00,>00,>00,>00,>00 * 0.44FCNST2 BYTE >41,>02,>00,>00,>00,>00,>00,>00 * 200.02FCNST3 BYTE >3F,>32,>00,>00,>00,>00,>00,>00 * 0.53NEGONE BYTE >BF,>FF,>00,>00,>00,>00,>00,>00 * -1.06TITLE TEXT 'Chaos Demonstration Using Lyapunov Space'.CREDIT TEXT 'By Walid Maalouli - October 2010'WAIT TEXT 'Calculating...'BAR TEXT '>>>>>>>>>>'PERCNT TEXT '0%100%' EVENSTART CLR R0 CLR R19NEXT1 MOVB R0,@IMAGE(R1) * CLEAR BYTE IN IMAGE TABLE INC R18 CI R1,>1800 * CHECK IF AT END OF TABLE JLT NEXT1 LI R0,>02004 BLWP @VWTR * RESTORE SIT TO >0000 LI R0,>04013 BLWP @VWTR * RESTORE PDT TO >8009 LI R0,>F000 * VALUE TO BE LOADED IN VR1K MOVB R0,@>83D4 * SAVE VALUE IN >83D4 (INTERPRETER WORKSPACE)8 LI R0,>01F0 * SELECTS TEXT MODE IN VR1/ BLWP @VWTR * START TEXT MODE CLR R09 LI R0,>0731 * SET COLORS GREEN ON BLACK BLWP @VWTR, CLR R0 * POINT TO SIT CLR R1A LI R2,960 * 960 SCREEN POSITIONS IN TEXT MODE5LOOP BLWP @VSBW * CLEAR SCREEN POSITION= INC R0 * POINT TO NEXT SCREEN POSITION DEC R2I JNE LOOP * REPEAT UNTIL ALL SCREEN POSITIONS CLEARED? LI R0,>78 * LOAD TEXT SCREEN LOCATION IN R04 LI R1,TITLE * POINT TO TEXT STRING0 LI R2,40 * LENGTH OF STRING4 BLWP @VMBW * PLACE TEXT ON SCREEN LI R0,>F4 LI R1,CREDIT LI R2,32 BLWP @VMBW LI R0,>1C4 LI R1,WAIT LI R2,14 BLWP @VMBW LI R0,>23A LI R1,PERCNT LI R2,2 BLWP @VMBW LI R0,>249 LI R1,PERCNT+2 LI R2,4 BLWP @VMBW7 INC @>83D6 * DISABLE SCREEN BLANKING* BEGIN CALCULATIONSREDO INC @COUNT9 C @COUNT,@MAXCNT * CHECK IF MAXCOUNT REACHED JLE CONT CLR @COUNT LI R0,FCNST1 LI R1,P0 BL @RADTRN * RESTORE P TO 0.4 B @GETTOTDCONT MOV @INDEX,R1 * PLACE PATTERN SEQUENCE INDEX INTO R19 MOV @PATRN(R1),R2 * GET NEXT PATTERN SEQUENCE CI R2,1 JNE NOTONE LI R0,RY LI R1,R0 BL @RADTRN * TRANSFER RY TO R JMP CONT1NOTONE LI R0,RX LI R1,R0 BL @RADTRN * TRANSFER RY TO R:CONT1 INCT @INDEX * POINT TO NEXT PATTERN ITEM C @INDEX,@DEC22 JLE CONT2B CLR @INDEX * RESET PATTERN SEQUENCE IF INDEX=22CONT2 LI R0,P LI R1,FAC/ BL @RADTRN * LOAD P INTO FAC LI R0,FP1 LI R1,ARG2 BL @RADTRN * LOAD FP 1 INTO ARG BLWP @XMLLNK# DATA >0700 * 1-P LI R0,P LI R1,ARG/ BL @RADTRN * LOAD P INTO ARG BLWP @XMLLNK' DATA >0800 * P*(1-P) LI R0,R LI R1,ARG/ BL @RADTRN * LOAD R INTO ARG BLWP @XMLLNK) DATA >0800 * R*P*(1-P) LI R0,FAC LI R1,P2 BL @RADTRN * SAVE RESULT INTO P CLR R1/NXTBYT C @P(R1),@FCNST2(R1) * CHECK IF P=0.5 JNE CONT3 INCT R1 CI R1,8 JLT NXTBYT9 B @REDO * IF IT IS THEN RECALCULATECONT3 LI R0,FP2 LI R1,FAC2 BL @RADTRN * PLACE 2.0 INTO FAC CLR R0 MOVB R0,@GPLSTS BLWP @GPLLNK& DATA >002A * LOG(2) LI R0,FAC LI R1,FPTMP4 BL @RADTRN * SAVE RESULT IN FPTMP LI R0,FP2 LI R1,FAC2 BL @RADTRN * PLACE 2.0 INTO FAC LI R0,R LI R1,ARG0 BL @RADTRN * PLACE R INTO ARG BLWP @XMLLNK# DATA >0800 * 2*R LI R0,P LI R1,ARG/ BL @RADTRN * LOAD P INTO ARG BLWP @XMLLNK% DATA >0800 * 2*R*P LI R0,R LI R1,ARG0 BL @RADTRN * PLACE R INTO ARG BLWP @XMLLNK) DATA >0700 * R-(2*R*P)> MOVB @FAC,R0 * PLACE THE RADIX OF FAC INTO R05 SRL R0,8 * MOVE HIGH BYTE TO LOWJ CI R0,>00B0 * CHECK IF RADIX INDICATES A NEGATIVE NUMBER JLT NOTNEG LI R0,NEGONE LI R1,ARG3 BL @RADTRN * PLACE -1.0 INTO ARG BLWP @XMLLNKB DATA >0800 * (R-(2*R*P))*-1 I.E. ABS(R-(2*R*P))NOTNEG CLR R0 MOVB R0,@GPLSTS BLWP @GPLLNK3 DATA >002A * LOG(ABS(R-(2*R*P))) LI R0,FAC LI R1,ARG2 BL @RADTRN * MOVE RESULT TO ARG LI R0,FPTMP LI R1,FAC5 BL @RADTRN * PLACE LOG(2) INTO FAC BLWP @XMLLNK: DATA >0900 * LOG(ABS(R-(2*R*P)))/LOG(2) LI R0,TOTAL LI R1,ARG4 BL @RADTRN * PLACE TOTAL INTO ARG BLWP @XMLLNKB DATA >0600 * TOTAL+(LOG(ABS(R-(2*R*P)))/LOG(2)) LI R0,FAC LI R1,TOTAL, BL @RADTRN * UPDATE TOTAL B @REDOGETTOT LI R0,TOTAL LI R1,ARG4 BL @RADTRN * PLACE TOTAL INTO ARG LI R0,FCNST2 LI R1,FAC4 BL @RADTRN * PLACE 200.O INTO FAC BLWP @XMLLNK) DATA >0900 * TOTAL/200 MOVB @FAC,R0 SRL R0,8 CI R0,>00B08 JGT DISPIX * DISPLAY PIXEL IF TOTAL<0 JMP CONT4ADISPIX MOV @SX,R8 * DISPLAY PIXEL IF NO CHAOS PRESENT MOV @SY,R9 BL @PLOTCONT4 LI R0,FPZERO LI R1,TOTAL+ BL @RADTRN * CLEAR TOTAL LI R0,RX LI R1,FAC1 BL @RADTRN * PLACE RX INTO FAC LI R0,XADD LI R1,ARG3 BL @RADTRN * PLACE XADD INTO ARG BLWP @XMLLNK' DATA >0600 * RX+XADD LI R0,FAC LI R1,RX) BL @RADTRN * UPDATE RX INC @SXE C @SX,@MAXX * CHECK IF REACHED RIGHT EDGE IF SCREEN JEQ INCY B @REDOINCY LI R0,RY LI R1,FAC1 BL @RADTRN * PLACE RY INTO FAC LI R0,YADD LI R1,ARG3 BL @RADTRN * PLACE YADD INTO ARG BLWP @XMLLNK' DATA >0600 * RY+YADD LI R0,FAC LI R1,RY) BL @RADTRN * UPDATE RY LI R0,FCONST LI R1,RX1 BL @RADTRN * RESTORE RX TO 3.1 INC @COUNT1 LI R0,COUNT1 LI R1,FAC; BL @RADTRN * PLACE GLOBAL COUNTER IN FAC BLWP @XMLLNK9 DATA >2300 * CONVERT TO FLOATING POINT LI R0,FAC LI R1,ARG/ BL @RADTRN * TRANSFER TO ARG LI R0,FP192 LI R1,FAC0 BL @RADTRN * PLACE 192 IN FAC BLWP @XMLLNK* DATA >0900 * COUNT1/192 LI R0,FP10 LI R1,ARG1 BL @RADTRN * PLACE 10.0 IN FAC BLWP @XMLLNK/ DATA >0800 * (COUNT1/192)*10 BLWP @XMLLNK9 DATA >1200 * CONVERT RESULT TO INTEGER BL @PROGBR CLR @SX DEC @SY JEQ DONE B @REDO=DONE LI R0,>07F1 * SET BACKGROUND COLOR TO BLACK BLWP @VWTR6 CLR @KEYADR * SELECT ENTIRE KEYBOARD* INITIALIZE BITMAP MODE LI R0,>A000> MOVB R0,@>83D4 * COPY OF VALUE TO BE PUT IN VR1 LI R0,>01A0, BLWP @VWTR * BLANK SCREEN LI R0,>02074 BLWP @VWTR * SIT ADDRESS AT >1C00 LI R0,>04034 BLWP @VWTR * PDT ADDRESS AT >0000 LI R0,>03FF3 BLWP @VWTR * CT ADDRESS AT >2000 LI R0,>053E> BLWP @VWTR * SPRITE ATTRIBUTE LIST AT >1F00 LI R0,>0603@ BLWP @VWTR * SPRITE DEFINITION TABLE AT >1800, LI R0,>1F00 * POINT TO SAL LI R1,>D000B BLWP @VSBW * MARK SAL AS INVALID (BLANK SPRITE): LI R0,>1C00 * SIT INITIALIZATION ROUTINE CLR R15 LI R2,3 * THREE SECTIONS TO SIT>SITINI BLWP @VSBW * PLACE HIGH BYTE OF R1 INTO SIT- INC R0 * NEXT SIT BYTE9 AI R1,>100 * INCREMENT HIGH BYTE OF R1: JNE SITINI * R1 WILL GO FROM >00 TO >FF1 DEC R2 * SIT SECTION COUNT JNE SITINI+ LI R0,>2000 * POINT TO CT> LI R1,>E100 * DEFINE COLORS AS GRAY ON BLACK, LI R2,>1800 * LENGTH OF CT?CTSET BLWP @VSBW * WRITE COLOR BYTE TO CT POSITION, INC R0 * NEXT CT BYTE@ DEC R2 * KEEP TRACK OF REMAINING CT BYTES> JNE CTSET * REPEAT UNTIL END OF CT REACHED6 LI R0,2 * SELECT VR0 AND VALUE 21 BLWP @VWTR * START BITMAP MODE LI R0,>E000 MOVB R0,@>83D4 LI R0,>01E0. BLWP @VWTR * TURN SCREEN ON, CLR R0 * POINT TO PDT5 LI R1,IMAGE * POINT TO STORED IMAGE- LI R2,>1800 * LENGTH OF PDT5 BLWP @VMBW * PLACE IMAGE ON SCREENNOTQ BL @KEYINP CB @KEY,@ASCQ JNE NOTQ BLWP @0P********************************************************************************'** RADIX 100 NUMBER TRANSFER ROUTINE **D* R0 HAS ADDRESS OF NUMBER TO TRANSFER, R1 HAS DESTINATION ADDRESS *3RADTRN MOV R11,@SUBRTN * SAVE RETURN ADDRESS CLR R27NEXT MOVB *R0+,*R1+ * MOVE BYTE FROM R0 TO R1 INC R2G CI R2,8 * THERE ARE 8 BYTES IN RADIX 100 NOTATION JLT NEXT MOV @SUBRTN,R11 B *R11P********************************************************************************** PIXEL PLOT ROUTINE **$** R8 HAS X VALUE, R9 HAS Y VALUE **PLOT MOV R8,R0 MOV R9,R13 MOV R1,R4 * R1 CONTAINS Y VALUE SLA R4,5 SOC R1,R4 ANDI R4,>FF073 MOV R0,R5 * R0 CONTAINS X VALUE ANDI R5,78 A R0,R4 * R4 IS BYTE OFFSET IN PDT7 S R5,R4 * R5 IS BIT OFFSET IN PDTA MOVB @IMAGE(R4),R1 * GET CURRENT BYTE FROM IMAGE TABLE6 MOVB @M(R5),R2 * SELECT PIXEL TO BE LITC SOC R2,R1 * OR PIXEL LOCATION WITH CURRENT BYTE> MOVB R1,@IMAGE(R4) * SAVE PIXEL INFO IN IMAGE TABLE RTP********************************************************************************** KEY INPUT ROUTINE **KEYINP CLR R05 MOVB R0,@GPLSTS * CLEAR GPL STATUS BYTE0 MOVB R0,@KEYADR * CLEAR KEY BUFFER4 BLWP @KSCAN * CALL KEYSCAN ROUTINE1 LIMI 2 * ENABLE INTERRUPTS2 LIMI 0 * DISABLE INTERRUPTS RTP********************************************************************************"** PROGRESS BAR DISPLAY ROUTINE **#* FAC HAS PERCENTAGE/10 COMPLETED *;PROGBR MOV @FAC,R2 * PLACE PERCENTAGE/10 INTO R23 CI R2,0 * CHECK IF STILL AT 0 JEQ SKIP> LI R0,>23E * SCREEN ADDRESS OF PROGRESS BAR5 LI R1,BAR * POINT TO PROGRESS BAR+ BLWP @VMBW * DISPLAY BAR SKIP RTP******************************************************************************** END