.TITLE OPERATIONS .PSECT EXECUT .LIBRARY /SY:MACLIB/ .MCALL SAVE,.TTYIN,.TTINR,.TTYOUT,.TTOUTR,.PRINT,.EXIT,SPACE .ENABL AMA,GBL,MCL,LC .NLIST ME,BEX,SYM,TOC ;Schedule or Uschedule a subroutine for execution by the scheduler ; ;Uses R0 for subroutine address ; R1 timeperiod ; ; SYSTEM USAGE i.e SCHEDULE SUBROUTINE,TIMEPERIOD ; | | ; "any application subroutine" ___________| | ; i.e. #DFAOUT..(R0..@LIST..etc | ;Time period may be specified in two forms__________________| ; i.e ... 1/60 or 60th ; TEN or 10SEC etc. ; ;Unspecified time period will "schedule 1/60th second for execution" ; "unschedule from execution by default" ; ;Subr's may also be scheduled/unscheduled in the application program ;by... MOV #SUBR,R0 ; MOV #LST160,R1 ; CALL SCHEDULE/UNSCHEDULE .MACRO SCHEDULE SUBROUTINE,TIMEPERIOD MOV #SUBROUTINE,R0 MOV (PC)+,R1 .IF B TIMEPERIOD .WORD LST160 .IFF PERIOD .ENDC CALL SCHEDULE .ENDM .MACRO UNSCHEDULE SUBROUTINE,TIMEPERIOD MOV #SUBROUTINE,R0 MOV (PC)+,R1 .IF B TIMEPERIOD .WORD 0 .IFF PERIOD .ENDC CALL UNSCHEDULE .ENDM .SBTTL TIME PERIOD ; The macro "PERIOD" is used by the sceduler to ; Determine the time period "specified by the macro SCHEDULE" ; SYTEM USAGE... ; Schedule the subroutine.. ; TIMEPERIOD EACH ; 1/60,60TH = 60TH of a second ; 1/30,30TH = 30TH of a second ; 1/20,20TH = 20TH of a second ; 1/10,10TH = 10TH of a second ; 1/5 ,5TH = FIFTH of a second ; 1/2 ,HALF = HALF of a second ; 1SEC,ONE = ONE second ; 2SEC,TWO = TWO seconds ; 5SEC,FIVE = FIVE seconds ; 10SEC,TEN = TEN seconds ; 20SEC,TWENTY = TWENTY seconds ; 30SEC,THIRTY = THIRTY seconds ; 60SEC,SIXTY = SIXTY seconds .MACRO PERIOD TIMEPERIOD .IIF IDN ,1/60 .WORD LST160 .IIF IDN ,60TH .WORD LST160 .IIF IDN ,1/30 .WORD LST130 .IIF IDN ,30TH .WORD LST130 .IIF IDN ,1/20 .WORD LST120 .IIF IDN ,20TH .WORD LST120 .IIF IDN ,1/10 .WORD LST110 .IIF IDN ,10TH .WORD LST110 .IIF IDN ,1/5 .WORD LST105 .IIF IDN ,5TH .WORD LST105 .IIF IDN ,1/2 .WORD LST102 .IIF IDN ,HALF .WORD LST102 .IIF IDN ,1SEC .WORD LST001 .IIF IDN ,ONE .WORD LST001 .IIF IDN ,2SEC .WORD LST002 .IIF IDN ,TWO .WORD LST002 .IIF IDN ,5SEC .WORD LST005 .IIF IDN ,FIVE .WORD LST005 .IIF IDN ,10SEC .WORD LST010 .IIF IDN ,TEN .WORD LST010 .IIF IDN ,20SEC .WORD LST020 .IIF IDN ,TWENTY .WORD LST020 .IIF IDN ,30SEC .WORD LST030 .IIF IDN ,THIRTY .WORD LST030 .IIF IDN ,60SEC .WORD LST060 .IIF IDN ,SIXTY .WORD LST060 .ENDM .SBTTL COMMAND LIST ; Parse the various commands to determine what to do! COMLST::COMLIN ; COMMAND A "LINE COMPNT ; "POINT COMREC ; "RECTANGLE COMTRI ; "TRIANGLE COMCIR ; "CIRCLE COMORG ; "ORIGIN COMPGE ; "PAGE COMCOL ; "COLOR COMTXT ; "TEXT WRITE COMCHR ; "CHARACTER COMSCR ; "SCROLL COMDSP ; "DISPLAY CHG COMDEL ; "DELETE COMCUR ; "CURSOR COMSIZ ; "SIZE COMEXT ; "EXIT COMPRO ; "PROPORTIONAL COMUP ; "UP IN POSITION COMDWN ; "DWN IN POSITION COMLFT ; "LEFT IN POSITION COMRGT ; "RIGHT IN POSITION COMDRW ; "DRAW THE FIGURE COMFIL ; "FILL IT UP COMRHO COMCLP ; "CLIP THE EDGE 0 ; End of list ; The "commands" are text messages ... if they are = to typed msg! ; use as an offset to determine the subsequent action ;XXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXXXX ; XXXXXXXXXX XXXXXXXXXX XXXXXXXXXX XXXXXXXX ;A- LI-NE B- PO-INT C- RE-CTANGLE PAGE1:: .BYTE 33,133,61,71,73,62,64,162 .BYTE 33,133,61,73,61,110,33,133,62,112 AI AI .BYTE 15,12,12 AI COMON: AI ;"CURSOR ON COMOFF: AI ;"CURSOR OFF COMCUR: AI ;"CURSOR COMUP: AI ;"UP IN POSITION COMDWN: AI ;"DWN IN POSITION COMLFT: AI ;"LEFT IN POSITION COMRGT: AI ;"RIGHT IN POSITION .BYTE 15,12,12 AI COMDSP: AI ;"DISPLAY CHANGE COMSCR: AI ;"SCROLL COMPGE: AI ;"PAGE COMCOL: AI ;"COLOR .BYTE 15,12,12 AI COMPRO: AI ;"PROPORTIONAL COMSIZ: AI ;"SIZE .BYTE 15,12 COMTXT: AI ;"TEXT WRITE COMCHR: AI ;"CHARACTER COMDEL: AI ;"DELETE .BYTE 15,12,12 AI COMCIR: AI ;"CIRCLE COMRHO: AI COMORG: AI ;"ORIGIN .BYTE 15,12 COMLIN: AI ;COMMAND A "LINE COMPNT: AI ;"POINT COMDRW: AI ;"DRAW A FIGURE .BYTE 15,12 COMREC: AI ;"RECTANGLE COMTRI: AI ;"TRIANGLE .BYTE 15,12,12 AI COMEXT: AI ;"EXIT FROM PROGRAM COMFIL: AI ;"FILL THE FIGURE COMCLP: AI ;"CLIP THE EDGES .BYTE 33,133,62,64,73,61,110 .BYTE 200 .EVEN ;The following list is used to determine the subroutine ; to be executed when the command has been parsed SUBLST::SUBLIN ; SUBR FOR "LINE SUBPNT ; "POINT SUBREC ; "RECTANGLE SUBTRI ; "TRIANGLE SUBCIR ; "CIRCLE SUBORG ; "ORIGIN SUBPGE ; "PAGE SUBCOL ; "COLOR SUBTXT ; "TEXT WRITE SUBCHR ; "CHARACTER SUBSCR ; "SCROLL SUBDSP ; "DISPLAY CHG SUBDEL ; "DELETE SUBCUR ; "CURSOR SUBSIZ ; "SIZE SUBEXT ; "EXIT SUBPRO ; "PROPORTIONAL SUBUP ; "UP IN POSITION SUBDWN ; "DWN IN POSITION SUBLFT ; "LEFT IN POSITION SUBRGT ; "RIGHT IN POSITION SUBDRW ; "DRAW SPECIFIED FIGURE SUBFIL ; "FILL UP THE FIGURE SUBRHO ; "RHOMBUS SUBCLP ; "CLIP THE EDGES .SBTTL OPERATIONAL TESTS START:: CALL INSTALL CALL INITG BIS #10000!40000,@#44 CLR SIZE MOV #511.,XPOS MOV #255.,YPOS LOOP: SCHEDULE SUB2,ONE JMP TTR ; Alternately "WRITE" A SQUARE ; ; CYCLE 1 IF COLOR = WHITE Write #177 (square) ; CYCLE 2 IF COLOR = WHITE CLEAR COLOR to black ; Write #177 ; RESET COLOR to white SUB2:: TST CURSON ; CURSOR ALLOWED? BEQ 3$ SAVE COLOR MOV #177,R5 COM (PC)+ ; Alternate flg .WORD 0 BPL 1$ CLR COLOR BR 2$ 1$: MOV R5,COLOR 2$: CALL CHAR SUB #6,XPOS RSTORE COLOR 3$: RETURN CONTINUE::0 .SBTTL TERMINAL READ ; Read the input characters from the terminal!! ; store them in a buffer until a is inputted ; Parse the inputted command and determine the action to ; be taken BUFFER: .BLKW 64. ;Adequate for a start anyway! PROMPT: AI ;Request a command! .BYTE 200 ERROR: AZ BACKUP: .BYTE 10,40,10,200 .EVEN .ENABL LSB TTR: .PRINT #PAGE1 TTREAD: CLR STOP .PRINT #PROMPT ;Get input after a prompt 1$: MOV #BUFFER,R1 ;STORE THE MSG HERE CLR R2 ;Clear the character count 2$: .TTYIN (R1) ;IS IT THERE??? CMPB R0,#177 BNE 3$ .PRINT #BACKUP CMPB -(R2),-(R1) BR 2$ 3$: INC R2 ;CHARACTER COUNT .TTYOUT (R1)+ CMPB #12,R0 ;A "Line Feed" ? BNE 2$ ;Parse the command for it's nature and parameters 4$: MOV SP,(PC)+ ;STOP any further interrupts STOP:: 0 MOV #COMLST,R0 ;COMPARE AGAINST THE COMMAND LIST SAVE R0 ;use to determine the OFFSET SUB R2,R1 ;Compare the input line TST -(R2) ;Delete the CR & LF count MOV #2,R5 5$: SAVE R0,R1,R5 MOV (R0),R0 ;GET THE ADDRESS OF EACH LIST 6$: CMPB (R0)+,(R1)+ ;Compare 4 characters BNE 7$ ;NO USE GOING ON! SOB R5,6$ ;The line command part matched, find the rest of it!!! JMP COMMAND ;Break down the rest of it 7$: RSTORE R0,R1,R5 ;RSTORE THE REGISTERS TST (R0)+ ;ADD 2 TST (R0) ;End of list? BNE 5$ RSTORE R0 ;RSTORE THE STACK CALL PARSE ;Parse for single characters BEQ TTREAD ERROR1::.PRINT #ERROR ;AN ILLEGAL COMMAND BR TTREAD .DSABL LSB .SBTTL COMMAND PROCESSING ;The initial "unique" characters were correct... ; fetch the follow-on parameters (if there are any) ; ; R0 -----> #MSG + 2 ; R1 -----> #BUFFER + 2 ; R2 = CHARACTER COUNT COMMAND: ;Original instruction was "SAVE R0,R1,R5" ; ... perfectly legal to "restore to other registers" RSTORE R3,R4,R5 ;Correct stack,----> "buffer start" ; R0 -----> #MSG +2 ; R1 -----> #BUFFER +2 ; R2 = CHARACTER COUNT ; R3 -----> #COMLST + (X) ;AN OFFSET ; R4 -----> #BUFFER ; R5 = 2 SUB (SP)+,R3 ;"Subtract" start of list for offset SUB R5,R2 ; Tested 2 so far BEQ 3$ ; R3 = OFFSET TO "SUB LST" ; R2 = #CHARACTERS LEFT TO "PARSE" 1$: CMPB (R1)+,#40 ; is it a space? BEQ 2$ ; Point to 1st byte after space SOB R2,1$ ; AT the end of the command? BR 3$ ; Do something ... if R5 = 0 .... it's the end ; ELSE ... there is data to be broken down 2$: DEC R2 3$: TST CURSON BEQ 4$ CALL DELETE 4$: CALL @SUBLST(R3) ; Call the correct subroutine CALL REPORT .PRINT #POSITION JMP TTREAD ; TEMPORARY REPORT: MOV #LIST1,R1 MOV (R1)+,R2 MOV (R1)+,R3 MOV (R1)+,R4 MOV (R1)+,R5 1$: SAVE R1,R2,R3,R4 MOV @(R1),R1 MOV (R2),R2 2$: CLR R0 DIV (R3)+,R0 ADD #'0,R0 MOVB R0,(R2)+ SOB R4,2$ RSTORE R1,R2,R3,R4 CMP (R1)+,(R2)+ SOB R5,1$ RETURN LIST1: .WORD LIST2 .WORD DIVLST .WORD 4,6 XPOS,YPOS,COLOR,XORG,YORG,CLIP LIST2: CX,CY,C0,XO,YO,CL POSITION: .BYTE 33,133,61,67,73,61,110 ;$[(line 1);(col 26) H AI CX: .BYTE '0,'0,'0,'0 AI < Y=> CY: .BYTE '0,'0,'0,'0 AI < COLOR => C0: .BYTE '0,'0,'0,'0 AI < XORG => XO: .BYTE '0,'0,'0,'0 AI < YORG => YO: .BYTE '0,'0,'0,'0 AI < CLIP => CL: .BYTE '0,'0,'0,'0 .BYTE 33,133,62,64,73,61,110 .BYTE 200 .EVEN DIVLST: 1000.,100.,10.,1 .END