home *** CD-ROM | disk | FTP | other *** search
- ;7 SEPT 79; CLEAN UP NO$OPS,INITIALIZE RATE.
- ; ADD MUL,DIV,COUNT,ENDCOUNT OPS.
- ;
- ;
- ; -- EXEC -- WITTENBERG & MOSHELL.
- * THIS ROUTINE "EXECUTES" A FELIX OBJECT CODE PROGRAM VIA THE FOLLOWING
- * METHOD. AN OPERATOR CODE (0-255) IS TAKEN FROM THE LOCATION POINTED
- * TO BY FELIX'S PROGRAM COUNTER ("FPC"). THIS IS USED (TIMES 2) AS A POINTER
- * INTO A TABLE OF OPERATOR ADDRESSES. THE PROPER ROUTINE ADDRESS IS
- * TAKEN FROM THE TABLE AND IS JUMPED TO. THE ROUTINE ITSELF IS
- * RESPONSIBLE FOR CALLING "INPAR" AND OUTPAR" TO KEEP TRACK OF PARAMETERS.
- *
- DISPON EQU 5054H
- DISPOFF EQU 5057H;
- TRFLAG EQU 5095H
- HEXPRT EQU 5042H
- CRLF EQU 5024H
- CONSTAT EQU 503FH
- FPUSH EQU 505AH
- FPOP EQU 505DH
- CPM EQU 0
- CI EQU 5027H
-
- CO EQU 502AH
- CHAR EQU 5096H
- BASE EQU 100H
- STACK EQU 200H
- FLAGS EQU 114H
- OUTPAR EQU 5033H
- INPAR EQU 5030H
- RATE EQU 5094H
- BACKGRND EQU 5092H
- FPC EQU 110H
- DSKRD EQU 5039H
- FSTACK EQU 112H
- F$RAMTOP EQU 116H
- ;
- ORG 2800H
- EXEC: LXI SP,4000H ;INITIALIZE THE FELIX STACK POINTER
- LXI H,BASE ;READ THE USER PROGRAM AND INITIAL INFO
- CALL DSKRD ;STARTING AT THE FELIX BASE ADDRESS
- ;
- ; NOW PICK UP PERMANENT STACK POINTER
- ;
- ;
- ; ---THIS INSTRUCTION MUST BE AT 2809H OR 'FASM' MUST BE
- ; NOTIFIED OF THE CHANGE. 'FASM' INITIALIZES A JUMP AT 100
- ; IN THE .FEX FILE TO COME HERE FOR USE WITH CARTOONS WHICH
- ; INCLUDE EXEC IN ONE HUGE .COM FILE.
- ;
- LXI SP,STACK
- ;
- * TURN ON THE DISPLAY.
- CALL DISPON
- SUB A
- STA RATE ;INITIALIZE RATE TO ZERO.
- *
- * THE FOLLOWING THREE INSTRUCTIONS ARE VERY TRICKY, BUT ALSO VERY
- * USEFUL. THE CALL JUMPS AROUND THE OTHER TWO, WHILE PUTTING ITS
- * RETURN ADDRESS ON THE STACK. WHEN A "RET" IS EXECUTED BY AN
- * OPERATOR, WE WILL RETURN TO THE SECOND INSTRUCTION OF THE THREE.
- * THE SECOND AND THIRD INSTRUCTIONS RESET THE STACK POINTER SO
- * THAT ANOTHER "RET" WILL RETURN US TO THE SAME PLACE.
- * IN OTHER WORDS, WE HAVE A FAST WAY TO DO MULTIPLE JUMPS TO
- * A PARTICULAR ADDRESS.
- CALL RESTRT ;SET RETURN ADDRESS AND SKIP NEXT 2 INSTS.
- DCX SP ;RESET RETUURN ADDRESS
- DCX SP
- RESTRT: LHLD FPC ;GET FELIX PROGRAM COUNTER
- MOV E,M ;GET CURRENT OP CODE
- INX H ;UPDATE FPC AND STORE IT
- SHLD FPC
- LDA TRFLAG
- ORA A
- CNZ TRACE ;TRACE EXECUTION IF WANTED
- LDA RATE
- ORA A
- CNZ DELAY
- ;
- ; CHECK FOR CHARACTER INPUT.
- ;
- CALL CONSTAT
- ORA A ;SET FLAGS
- JZ HOP ;NOTHING INCOMING.
- ;
- CALL CI ;GET CHARACTER.
- CPI 03H ;IS IT CTRL/C?
- JNZ STORCHAR
- ;
- ; CTRL/C; END OPERATIONS, GO AWAY.
- ;
- CALL DISPOFF
- JMP CPM
- ;
- STORCHAR:MOV C,A
- LDA CHAR ;SEE IF WE ALREADY HAVE A CHARACTER.
- ORA A
- JNZ BEEP ;YES; BEEP TO REPORT OVERRUN.
- ;
- ; PUT DOWN THE NEW CHARACTER
- ;
- MOV A,C ;GET IT BACK
- STA CHAR
- JMP HOP
- ;
- BEEP: MVI A,07H ;BELL CHAR.
- CALL CO ;PUT IT OUT
- ;
- HOP: MVI D,0 ;MAKE OP CODE AN INDEX INTO A TABLE
- XCHG ;OF OPERATOR ADDRESSES
- DAD H
- LXI D,OPTAB ;GET BASE ADDRESS OF TABLE
- DAD D ;ADD BASE TO DISPLACEMENT
- MOV E,M ;GET ADDRESS OF DESIRED OPERATOR OUT OF
- INX H ;TABLE
- MOV D,M
- XCHG ;GET ADDRESS INTO HL SO WE CAN...
- PCHL
- * THIS ROUTINE "TRACES" THE EXECUTION OF THE CURRENT FELIX PROGRAM
- * HL IS ASSUMED TO CONTAIN VALUE OF FPC PLUS ONE
- * E IS ASSUMED TO CONTAIN THE CURRENT OP CODE
- TRACE: DCX H ;ADJUST FPC
- CALL DISPHL ;DISPLAY IT
- LXI H,ARROW
- CALL PRINT
- MOV A,E
- CALL HEXPRT ;DISPLAY CURRENT OP-CODE
- CALL CRLF
- RET
- ARROW DB '=>',STOP
- ; DELAY WAITS 1 MILLISECOND FOR EACH COUNT-DOWN OF ACCUM
- ; ULATOR...FOR SLOWING AN ANIMATION. SEE ALSO RATE-OP.
- ;
- DELAY: PUSH H
- DEREGO: MVI H,55 ;1 MILLISEC.DELAY.
- DELOOP: PUSH H
- POP H ;TIME WASTERS
- DCR H
- JNZ DELOOP
- DCR A
- JNZ DEREGO
- POP H
- RET
- ; JUMP OPERATORS
- ;
- ; NOTE: ALL JMPS (OPCODES E0 THROUGH FE) USE TWO BYTES
- ; AFTEER OPCODE AS ADDR (LO-HI)0WITHOUT INPAR HELP.
- ;
- JUMPPL: LDA FLAGS
- ANI 80H
- JNZ NOJUMP
- JMP JUMP
- JUMPMI: LDA FLAGS
- ANI 80H
- JZ NOJUMP
- JMP JUMP
- JUMPNZ: LDA FLAGS
- ANI 40H
- JNZ NOJUMP
- JMP JUMP
- JUMPZ: LDA FLAGS
- ANI 40H
- JZ NOJUMP
- JMP JUMP
- JUMPNC: LDA FLAGS
- ANI 02H
- JNZ NOJUMP
- JMP JUMP
- JUMPC: LDA FLAGS
- ANI 02H
- JZ NOJUMP
- JMP JUMP
- ; HERE'S THE ACTUAL JUMPER:
- ;
- JUMP: LHLD FPC
- MOV E,M
- INX H
- MOV D,M
- XCHG
- SHLD FPC
- RET ;BACK TO EXEC
- ;
- ; HERE'S THE VERY SIMILAR NOJUMPER:
- ;
- NOJUMP: LHLD FPC
- INX H
- INX H
- SHLD FPC ;AVOID THE JUMP ADDRESS.
- RET
- ; NEW FLOCK OF CALL&ETC.OPS, 4/79. USE FELIX'S OWN STACK.
- ; DESIGN BY SCHULZ,PROGRAM BY MOSHELL.
- ;
- ; A COUPLE OF REALLY TRIVIAL OPS,EH?
- ;
- PUSHOP: CALL INPAR
- CALL FPUSH
- RET
- POPOP: CALL FPOP
- CALL OUTPAR
- RET
- ;
- ; AND A SUBTLE ONE.
- ;
- CALLOP: LHLD FPC
- MOV E,M
- INX H
- MOV D,M ;DE HAS CALLED-ROUTINE-ADDRESS.
- INX H
- XCHG ;HL HAS CALLED-ROUTINE-ADDRESS.
- SHLD FPC ;SO STASH IT IN FPC.
- CALL FPUSH ;DE HAS RETURN ADDRESS;PUSH IT.
- RET ;AND GO BACK TO EXEC.
- ;
- RETOP: CALL FPOP ;SO DE HAS RETURN ADDR.
- XCHG
- SHLD FPC ;AND NOW FPC HAS IT.
- RET
- ;
- ;
- ;
- ; BACKGRND FILLS BACK-BUFF WITH GIVEN (INPAR) COLOR.
- ;
- BACKOP: CALL INPAR ;E NOW HAS COLOR.
- LHLD BACKGRND
- MOV A,E
- RRC
- RRC
- RRC
- RRC
- ORA E
- MOV E,A
- LXI B,800H ;LENGTH OF BUFFER.
- BLOOP: MOV M,E
- INX H
- DCX B
- MOV A,B
- ORA C
- JNZ BLOOP
- RET
- ;
- ;
- ; DELAY OPERATOR ... JUST SETS THE RATE VALUE,THAT:S ALL.
- ;
- DELAYOP: CALL INPAR
- MOV A,E
- STA RATE
- RET
- ;
- ; HALT OP...
- ;
- HALTOP: CALL DISPOFF
- JMP 0H ;RETURN TO CP/M.
- ;
- ;
- ;
- ;
- ; ILLEGAL OPERATOR OPERATOR
- ;
- PRINT EQU 502DH
- CR EQU 0DH
- LF EQU 0AH
- STOP EQU '$'
- DISPHL EQU 5045H
- * THIS NEW ROUTINE IS BY LEE WITTENBERG (JUNE 19, 1979)
- * IT DISPLAYS AN ERROR MESSAGE AND THE ADDRESS OF AN
- * ILLEGAL OP-CODE WHICH HAS JUST BEEN "EXECUTED"
- NO$OP: LHLD FPC ;ADDRESS OF OFFENDING OP-CODE IS
- DCX H ;FPC - 1
- CALL DISPHL ;DISPLAY IT
- LXI H,NOPMSG
- CALL PRINT ;FOLLOWED BY ERROR MESSAGE
- RET
- NOPMSG DB '<--ILLEGAL OPERATOR CODE ENCOUNTERED',CR,LF,STOP
- **********************************************************
- *
- * OPCODES TABLE
- *
- ***********************************************************
- ;
- OPTAB: EQU $
- DW HALTOP ;HALT (00)
- DW 2BD0H ;SHOW (01)
- DW PUSHOP ;PUSH (02)
- DW POPOP ;POP (03)
- DW RETOP ;RETURN (04)
- DW DELAYOP ;DELAY (05)
- DW 2C50H ;ONLIST (06)
- DW 2DB0H ;POSIT (07)
- DW 2E30H ;FLY (08)
- DW BACKOP ;NEWBACK(09)
- DW 54E0H ;SPIN (0A)
- DW 5500H ;SETANGL(0B)
- DW NO$OP ;TURN (0C)--NOT YET IMPLEMENTED. (NYI)
- DW 2E70H ;DIST (0D)
- DW 2E50H ;WHERE (0E)
- DW 2C80H ;BACKGRND(0F)
- ; ARITHMETIC OPS - - - - - - - - - -
- ORG OPTAB+(2*10H)
- DW 5302H ;MOVE (10)
- DW 5350H ;COMP (11)
- DW 5340H ;COMPU (12)
- DW 53E0H ;ADD (13)
- DW 53F0H ;SUB (14)
- DW NO$OP ;AND (15)--NYI
- DW NO$OP ;OR (16)--NYI
- DW NO$OP ;XOR (17)--NYI
- DW NO$OP ;SHIFT (18)--NYI
- DW NO$OP ;ROTATE (19)--NYI
- DW NO$OP ;MUL (1A)--NYI
- DW NO$OP ;DIV (1B)--NYI
- ; MISC. OPS
- DW 2F50H ;RESCALE(1C)
- DW 2CA0H ;RECOLOR(1D)
- DW NO$OP ;TURNON (1E)--NYI
- DW NO$OP ;TURNOFF(1F)--NYI
- ; FELIX PRIMITIVES - - - - - - - - -
- ORG OPTAB+(2*20H)
- DW 2B80H ;PUT (20)
- DW 2B8FH ;GET (21)
- DW 2BA0H ;OBJR (22)
- DW 2BB1H ;OBJW (23)
- DW 5620H ;PATH (24)
- DW 5690H ;PRINT(25)
- DW NO$OP ;COUNT(26)
- DW NO$OP ;ENDCOUNT(27)
-
- ;
- ; WE HAVE THE UNASSIGNED OPERATORS CALL THE ERROR
- ; ROUTINE.
- ;
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- ; JUMP AND CALL OPS - - - - - - - -
- ORG OPTAB+(2*0E0H)
- DW JUMP ;JUMP (E0)
- DW JUMPPL ;JPL (E1)
- DW JUMPMI ;JMI (E2)
- DW JUMPNZ ;JNZ (E3)
- DW JUMPZ ;JZ (E4)
- DW JUMPNC ;JNC (E5)
- DW JUMPC ;JC (E6)
- DW CALLOP ;CALL (E7)
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- DW NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
- ENDTAB: ORG OPTAB+200H
-