>$.TMP.!Sml.!RunImage Multitasker for !Sml (c) 1992 Robin Watts bent to do Siod 2.09 screen% 80*32 indir% 1024 windata% 4096 block% 256 code% 10000 menublock% 2048 cblock% 24 ON ERROR MODE MODE:REPORT:PRINT;" at line ";ERL:END assemble initialise getmodevars conch closedown initialise "Wimp_Initialise",200,&4B534154,"Siod Tasker" version%,task% closedown "Wimp_CloseDown",task%,&4B534154 conch setup loadwindows initmenus openwindow(mainwh%, grabcaret vdu(12) !ypos=31 launchsiod closedown% closealltasks setup size%=(!xmax+1)*(!ymax+1) closedown%= !caretowned%=0 prompt%= taskstarted%= loadwindows "Wimp_OpenTemplate",,".Templates" 9%mainwh%= doloadtemplate(0,"main") :%infowh%= doloadtemplate(1,"info") "Wimp_CloseTemplate" doloadtemplate(n%,ident$) whandle% "Wimp_LoadTemplate",,windata%+n%*2048,indir%+n%*512,indir%+n%*512+512,-1, ident$+ (0))),0 "Wimp_CreateWindow",,windata%+n%*2048 whandle% =whandle% openwindow(wh%,tooldsize%) !block%=wh% tooldsize% "Wimp_GetWindowInfo",,block% block%!28=-1 "Wimp_OpenWindow",,block% "Wimp_Poll",%110001,block% reason%,block% reason% redrawwindow openwindow(!block%, closealltasks mouseclicked keypressed menuselected gaincaret losecaret 17,18,19 block%!16 closealltasks &400C1 getmodevars &808C1 childoutput &808C2 childstarted &808C3 childdied redrawwindow "Wimp_RedrawWindow",,block% more% more%<>0 t. !minx%=(block%!28-block%!4+block%!20) u. !maxx%=(block%!36-block%!4+block%!20) v0 !miny%=-(block%!40-block%!16+block%!24) w2 !maxy%=-(block%!32-block%!16+block%!24) 32+1 redraw "Wimp_GetRectangle",,block% more% closealltasks taskstarted% block%!20=1 block%!16=&808C0 block%!0=28 block%!12=0 block%!24=4 "Wimp_SendMessage",17,block%,handle% taskstarted%= childdied assemble pass%=0 P%=code% [OPT pass% .screen EQUD screen% EQUD 0 .xmax EQUD 79 .ymax EQUD 31 .xwinmax EQUD 79 .xwinmin EQUD 0 .ywinmax EQUD 31 .ywinmin EQUD 0 .xpos EQUD 0 .ypos EQUD 0 .vdusupressed EQUD 0 .followingbytes EQUD 0 .numbertocome EQUD 0 .queueaddr EQUD queue .queue EQUD 0 EQUD 0 EQUD 0 EQUD 0 .bytestoignore EQUD 0 H \ Enter with Vdu Char in vdu @ \ No exit Conditions .dovdu + STMFD R13!,{R0-R12,R14} LDRB R0,vdu ( LDR R1,bytestoignore CMP R1,#0 " BNE ignorebyte ) LDR R1,followingbytes CMP R1,#0 ! BNE following ) CMP R0,#6 :BEQ vduon ' LDR R1,vdusupressed + CMP R1,#1 :BEQ ignore0 * CMP R0,#127:BEQ delete - CMP R0,#32 :BGE printable + CMP R0,#0 :BEQ ignore0 8 CMP R0,#1 : Q R0,#1 :BEQ ignore + CMP R0,#2 :BEQ ignore0 + CMP R0,#3 :BEQ ignore0 + CMP R0,#4 :BEQ ignore0 + CMP R0,#5 :BEQ ignore0 - CMP R0,#7 :BEQ printable - CMP R0,#8 :BEQ backspace 0 CMP R0,#9 :BEQ forwardspace , CMP R0,#10 :BEQ linefeed * CMP R0,#11 :BEQ upline ' CMP R0,#12 :BEQ cls + CMP R0,#13 :BEQ creturn + CMP R0,#14 :BEQ ignore0 + CMP R0,#15 :BEQ ignore0 + CMP R0,#16 :BEQ ignore0 8 CMP R0,#17 : Q R0,#1 :BEQ ignore 8 CMP R0,#18 : Q R0,#2 :BEQ ignore 8 CMP R0,#19 : Q R0,#5 :BEQ ignore + CMP R0,#20 :BEQ ignore0 * CMP R0,#21 :BEQ vduoff 8 CMP R0,#22 : Q R0,#1 :BEQ ignore 8 CMP R0,#23 : Q R0,#9 :BEQ ignore 8 CMP R0,#24 : Q R0,#8 :BEQ ignore 8 CMP R0,#25 : Q R0,#5 :BEQ ignore ) CMP R0,#26 :BEQ vdu26 + CMP R0,#27 :BEQ ignore0 . CMP R0,#28 :BEQ textwindow 8 CMP R0,#29 : Q R0,#4 :BEQ ignore ( CMP R0,#30 :BEQ home ' CMP R0,#31 :BEQ tab .ignore0 * LDMFD R13!,{R0-R12,PC} .vduon MOV R0,#0 ' STR R0,vdusupressed B ignore0 .delete 3 MOV R0,#8 :STR R0,vdu:BL dovdu 3 MOV R0,#32 :STR R0,vdu:BL dovdu 3 MOV R0,#8 :STR R0,vdu:BL dovdu LDR R1,xpos LDR R2,ypos " BL changedbox B ignore0 .backspace LDR R0,xpos LDR R1,ypos " LDR R2,xwinmin " LDR R3,ywinmin " LDR R4,xwinmax " LDR R5,ywinmax SUB R0,R0,#1 STR R0,xpos CMP R0,R2 BGE ignore0 MOV R0,R4 STR R0,xpos SUB R1,R1,#1 STR R1,ypos CMP R1,R3 BGE ignore0 ) BL scrolldownoneline MOV R1,R3 STR R1,ypos B ignore0 .forwardspace LDR R0,xpos LDR R1,ypos " LDR R2,xwinmin " LDR R3,ywinmin " LDR R4,xwinmax " LDR R5,ywinmax ADD R0,R0,#1 STR R0,xpos CMP R0,R4 BLE ignore0 MOV R0,R2 STR R0,xpos ADD R1,R1,#1 STR R1,ypos CMP R1,R5 BLE ignore0 ' BL scrolluponeline MOV R1,R5 STR R1,ypos B ignore0 .linefeed MOV R0,#13 STR R0,vdu BL dovdu LDR R0,xpos LDR R1,ypos $" LDR R2,xwinmin %" LDR R3,ywinmin &" LDR R4,xwinmax '" LDR R5,ywinmax ( ADD R1,R1,#1 STR R1,ypos CMP R1,R5 BLE ignore0 ,' BL scrolluponeline MOV R1,R5 STR R1,ypos B ignore0 .upline LDR R0,xpos LDR R1,ypos 3" LDR R2,xwinmin 4" LDR R3,ywinmin 5" LDR R4,xwinmax 6" LDR R5,ywinmax 7 SUB R1,R1,#1 STR R1,ypos CMP R1,R3 BGE ignore0 ;) BL scrolldownoneline MOV R1,R3 STR R1,ypos B ignore0 @" LDR R1,xwinmax A" LDR R2,ywinmax B! BL changedbox MOV R4,R1 MOV R5,R2 E" LDR R1,xwinmin F" LDR R2,ywinmin G! BL changedbox MOV R3,R2 MOV R2,R1 LDR R6,xmax K ADD R6,R6,#1 L! LDR R8,screen MOV R9,#&20 MOV R1,R3 .clslp1 MOV R0,R2 .clslp2 R# MLA R7,R1,R6,R8 S ADD R7,R7,R0 T STRB R9,[R7] U ADD R0,R0,#1 CMP R0,R4 BLE clslp2 X ADD R1,R1,#1 CMP R1,R5 BLE clslp1 STR R2,xpos STR R3,ypos B ignore0 .creturn _" LDR R0,xwinmin STR R0,xpos B ignore0 .vduoff MOV R0,#1 d' STR R0,vdusupressed B ignore0 .vdu26 MOV R0,#0 h" STR R0,xwinmin i" STR R0,ywinmin STR R0,xpos STR R0,ypos LDR R0,xmax m" STR R0,xwinmax LDR R0,ymax o" STR R0,ywinmax B ignore0 .textwindow MOV R0,#28 s) STR R0,followingbytes MOV R0,#4 u' STR R0,numbertocome B ignore0 .textwindow2 x# LDRB R0,queue+3 y# LDRB R1,queue+2 z# LDRB R2,queue+1 {! LDRB R3,queue LDR R4,xmax LDR R5,ymax CMP R0,R2 BGT ignore0 CMP R1,R3 BLT ignore0 CMP R2,R4 BGT ignore0 CMP R3,R5 BGT ignore0 " STR R0,xwinmin " STR R1,ywinmax " STR R2,xwinmax " STR R3,xwinmin B ignore0 .home " LDR R0,xwinmin STR R0,xpos " LDR R1,ywinmin STR R2,ypos B ignore0 MOV R0,#31 ) STR R0,followingbytes MOV R0,#2 ' STR R0,numbertocome B ignore0 .tab2 # LDRB R0,queue+1 ! LDRB R1,queue " LDR R2,xwinmin " LDR R3,ywinmin " LDR R4,xwinmax " LDR R5,ywinmax ADD R0,R0,R2 ADD R1,R1,R3 CMP R0,R4 BGT ignore0 CMP R1,R5 BGT ignore0 STR R0,xpos STR R1,ypos B ignore0 .ignore ( STR R0,bytestoignore B ignore0 .ignorebyte SUB R0,R0,#1 ( STR R0,bytestoignore B ignore0 .following ' LDR R2,numbertocome $ LDR R3,queueaddr ! SUBS R2,R2,#1 # STRB R0,[R3,R2] ' STR R2,numbertocome BGE ignore0 / CMP R1,#28 :BEQ textwindow2 ( CMP R1,#31 :BEQ tab2 B ignore0 .printable ! LDR R5,screen LDR R1,xpos LDR R2,ypos ! BL changedbox LDR R4,xmax ADD R4,R4,#1 # MLA R5,R4,R2,R5 # STRB R0,[R5,R1] " B forwardspace .scrolldownoneline + STMFD R13!,{R0-R12,R14} " LDR R1,xwinmax " LDR R2,ywinmax ! BL changedbox MOV R3,R2 " LDR R1,xwinmin " LDR R2,ywinmin ! BL changedbox MOV R0,R1 MOV R1,R2 " LDR R2,xwinmax CMP R1,R3 & BEQ blankfirstline ! LDR R4,screen LDR R7,xmax ADD R7,R7,#1 SUB R8,R3,#1 .sdollp1 MOV R9,R0 .sdollp2 # MLA R6,R7,R8,R4 # LDRB R5,[R6,R9] ADD R6,R6,R7 # STRB R5,[R6,R9] ADD R9,R9,#1 CMP R9,R7 BLE sdollp2 SUB R8,R8,#1 CMP R8,R1 BGE sdollp1 .blankfirstline # MLA R6,R7,R1,R4 MOV R9,R0 MOV R5,#32 .sdollp3 # STRB R5,[R6,R9] ADD R9,R9,#1 CMP R9,R2 BLE sdollp3 * LDMFD R13!,{R0-R12,PC} .scrolluponeline + STMFD R13!,{R0-R12,R14} BL scrollbox " LDR R2,xwinmax " LDR R3,ywinmax " LDR R0,xwinmin " LDR R1,ywinmin CMP R1,R3 % BEQ blanklastline ! LDR R4,screen LDR R7,xmax ADD R7,R7,#1 ADD R8,R1,#1 .suollp1 MOV R9,R0 .suollp2 # MLA R6,R7,R8,R4 # LDRB R5,[R6,R9] SUB R6,R6,R7 # STRB R5,[R6,R9] ADD R9,R9,#1 CMP R9,R7 BLE suollp2 ADD R8,R8,#1 CMP R8,R3 BLE suollp1 .blanklastline # MLA R6,R7,R3,R4 MOV R9,R0 MOV R5,#32 .suollp3 # STRB R5,[R6,R9] ADD R9,R9,#1 CMP R9,R2 BLE suollp3 * LDMFD R13!,{R0-R12,PC} .changedbox + STMFD R13!,{R0-R12,R14} # LDR R0,changed% CMP R0,#0 & BNE changedalready & STR R1,changeminx% & STR R1,changemaxx% & STR R2,changeminy% & STR R2,changemaxy% MOV R1,#1 # STR R1,changed% * LDMFD R13!,{R0-R12,PC} .changedalready & LDR R0,changeminx% 2 CMP R1,R0:STRLT R1,changeminx% & LDR R0,changemaxx% 2 CMP R1,R0:STRGT R1,changemaxx% & LDR R0,changeminy% !2 CMP R2,R0:STRLT R2,changeminy% "& LDR R0,changemaxy% #2 CMP R2,R0:STRGT R2,changemaxy% $* LDMFD R13!,{R0-R12,PC} .scrollbox &+ STMFD R13!,{R0-R12,R14} '# LDR R0,changed% CMP R0,#0 )+ BLNE changebeforescroll *$ LDR R0,scrolled% CMP R0,#0 , BNE scrolled -" LDR R0,xwinmin .& STR R0,scrollminx% /" LDR R0,xwinmax 0& STR R0,scrollmaxx% 1" LDR R0,ywinmin 2& STR R0,scrollminy% 3" LDR R0,ywinmax 4& STR R0,scrollmaxy% MOV R0,#1 6' STR R0,scrollcount% 7$ STR R0,scrolled% 8* LDMFD R13!,{R0-R12,PC} .scrolled :" LDR R0,xwinmin ;& LDR R1,scrollminx% <. CMP R0,R1:BNE scrollnewwin =" LDR R0,ywinmin >& LDR R1,scrollminy% ?. CMP R0,R1:BNE scrollnewwin @" LDR R0,xwinmax A& LDR R1,scrollmaxx% B. CMP R0,R1:BNE scrollnewwin C" LDR R0,ywinmax D& LDR R1,scrollmaxy% E. CMP R0,R1:BNE scrollnewwin F' LDR R0,scrollcount% G ADD R0,R0,#1 H' STR R0,scrollcount% I* LDMFD R13!,{R0-R12,PC} .scrollnewwin K" LDR R0,xwinmin L& LDR R1,changeminx% M2 CMP R0,R1:STRLT R0,changeminx% N" LDR R0,xwinmax O& LDR R1,changemaxx% P2 CMP R0,R1:STRGT R0,changemaxx% Q" LDR R0,ywinmin R& LDR R1,changeminy% S2 CMP R0,R1:STRLT R0,changeminy% T" LDR R0,ywinmax U& LDR R1,changemaxy% V2 CMP R0,R1:STRGT R0,changemaxy% W. MOV R0,#0:STR R0,scrolled% X- MOV R0,#1:STR R0,changed% Y* LDMFD R13!,{R0-R12,PC} .changebeforescroll [+ STMFD R13!,{R0-R12,R14} \& LDR R0,changeminy% ] SUB R0,R0,#1 ^& STR R0,changeminy% _* LDMFD R13!,{R0-R12,PC} .scrolled% EQUD 0 .scrollminx% EQUD 0 .scrollminy% EQUD 0 .scrollmaxx% EQUD 0 .scrollmaxy% EQUD 0 .scrollcount% EQUD 0 .changed% EQUD 0 .changeminx% EQUD 0 .changeminy% EQUD 0 .changemaxx% EQUD 0 .changemaxy% EQUD 0 .caretowned% EQUD 0 .block EQUD block% .xpix% EQUD 0 .ypix% EQUD 0 .minx% EQUD 0 .miny% EQUD 0 .maxx% EQUD 0 .maxy% EQUD 0 .double% EQUD 0 .redraw + STMFD R13!,{R0-R12,R14} LDR R3,miny% ) CMP R3,#0:MOVLT R3,#0 LDR R4,maxy% LDR R5,ymax ) CMP R4,R5:MOVGT R4,R5 LDR R5,minx% ) CMP R5,#0:MOVLT R5,#0 LDR R6,maxx% LDR R12,xmax " ADD R12,R12,#1 + CMP R6,R12:MOVGT R6,R12 MOV R7,#16 MOV R8,#32 LDR R9,block " LDR R11,screen .redrawlp1 MOV R0,#4 # LDR R10,[R9,#4] # LDR R1,[R9,#20] ! SUB R1,R10,R1 # MLA R1,R5,R7,R1 $ LDR R10,[R9,#24] $ MLA R2,R3,R8,R10 $ LDR R10,[R9,#16] ! SUB R2,R10,R2 ! SWI "OS_Plot" MOV R14,R5 % MLA R1,R3,R12,R11 .redrawlp2 $ LDRB R0,[R1,R14] # SWI "OS_WriteC" " ADD R14,R14,#1 CMP R14,R6 ! BLE redrawlp2 ADD R3,R3,#1 CMP R3,R4 ! BLE redrawlp1 * LDMFD R13!,{R0-R12,PC} getmodevars !block%=0 block%!4=4 block%!8=5 block%!12=-1 "OS_ReadVduVariables",block%,block%+40 xeig%=block%!44 yeig%=block%!48 !xpix%=1<>5 grabcaret "Wimp_SetCaretPosition",mainwh%,-1,!xpos*8*!xpix%,-(!ypos+1)*32,32,0 !caretowned%=1 gaincaret losecaret mouseclicked button% button%=block%!8 (button% 4)=4 grabcaret (button% 2)=2 popupmenu popdownmenu keypressed char% char%=block%!24 !block%=mainwh% char%=(char% 255) block%!20=1 block%!16=&808C0 block%!0=28 block%!12=0 block%!24=char% "Wimp_SendMessage",17,block%,handle% "Wimp_ProcessKey",block%!24 "Wimp_ProcessKey",block%!24 launchsiod taskwindow(".!Siod209 -i.siod_scm -h20000") taskwindow(str$) command$ {command$="TaskWindow """+str$+""" -quit -wimpslot 640K -name ""Siod Engine"" -task &"+ ~(task%)+" -txt &00000000 -ctrl" "Wimp_StartTask",command$ childstarted handle%=block%!4 inputto%=block%!20 taskstarted%= childoutput dovduat(block%+20) dovduat(addr%) "Wimp_GetCaretPosition",,cblock% !cblock%=mainwh% !caretowned%=1 !caretowned%=0 !changed%=0 !scrolled%=0 l%=0 (!addr%)-1 !vdu=l%?(addr%+4) dovdu !scrolled%>0 !caretowned% "Wimp_SetCaretPosition",mainwh%,-1,-100,-100,32,0 "Wimp_BlockCopy",mainwh%,!scrollminx%*16,-(!scrollmaxy%+1)*32,(!scrollmaxx%+1)*16,-!scrollminy%*32+!ypix%-!scrollcount%*32,!scrollminx%*16,-(!scrollmaxy%+1)*32+!scrollcount%*32 "Wimp_ForceRedraw",mainwh%,!scrollminx%*16,-(!scrollmaxy%+1)*32,(!scrollmaxx%+1)*16,-(!scrollmaxy%+1)*32+!scrollcount%*32 !caretowned% "Wimp_SetCaretPosition",mainwh%,-1,!xpos*8*!xpix%,-(!ypos+1)*32,32,0 !changed%>0 "Wimp_ForceRedraw",mainwh%,!changeminx%*16,-(!changemaxy%+1)*32,(!changemaxx%+1)*16,-!changeminy%*32+!ypix% !caretowned% !scrolled% "Wimp_SetCaretPosition",mainwh%,-1,!xpos*8*!xpix%,-(!ypos+1)*32,32,0 vdu(n%) !changed%=0 !vdu=n% dovdu !changed%>0 "Wimp_ForceRedraw",mainwh%,!changeminx%*8*!xpix%,-(!changemaxy%+1)*(8<