home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpmug
/
cpmug035.ark
/
EXECPLUS.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
9KB
|
368 lines
;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