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

  1. ;7 SEPT 79; CLEAN UP NO$OPS,INITIALIZE RATE.
  2. ;        ADD MUL,DIV,COUNT,ENDCOUNT OPS.
  3. ;
  4. ;
  5. ; -- EXEC -- WITTENBERG & MOSHELL.
  6. * THIS ROUTINE "EXECUTES" A FELIX OBJECT CODE PROGRAM VIA THE FOLLOWING
  7. * METHOD.  AN OPERATOR CODE (0-255) IS TAKEN FROM THE LOCATION POINTED
  8. * TO BY FELIX'S PROGRAM COUNTER ("FPC").  THIS IS USED (TIMES 2) AS A POINTER
  9. * INTO A TABLE OF OPERATOR ADDRESSES.  THE PROPER ROUTINE ADDRESS IS
  10. * TAKEN FROM THE TABLE AND IS JUMPED TO.  THE ROUTINE ITSELF IS
  11. * RESPONSIBLE FOR CALLING "INPAR" AND OUTPAR" TO KEEP TRACK OF PARAMETERS.
  12. *
  13. DISPON  EQU    5054H
  14. DISPOFF    EQU    5057H;
  15. TRFLAG    EQU    5095H
  16. HEXPRT    EQU    5042H
  17. CRLF    EQU    5024H
  18. CONSTAT    EQU    503FH
  19. FPUSH    EQU    505AH
  20. FPOP    EQU    505DH
  21. CPM    EQU    0
  22. CI    EQU    5027H
  23.  
  24. CO    EQU    502AH
  25. CHAR    EQU    5096H
  26. BASE    EQU    100H
  27. STACK    EQU    200H
  28. FLAGS    EQU    114H
  29. OUTPAR    EQU    5033H
  30. INPAR    EQU    5030H
  31. RATE    EQU    5094H
  32. BACKGRND EQU    5092H
  33. FPC    EQU    110H
  34. DSKRD    EQU    5039H
  35. FSTACK    EQU    112H
  36. F$RAMTOP EQU    116H
  37. ;
  38.     ORG    2800H
  39. EXEC:    LXI    SP,4000H    ;INITIALIZE THE FELIX STACK POINTER
  40.     LXI    H,BASE        ;READ THE USER PROGRAM AND INITIAL INFO
  41.     CALL    DSKRD    ;STARTING AT THE FELIX BASE ADDRESS
  42. ;
  43. ; NOW PICK UP PERMANENT STACK POINTER
  44. ;
  45. ;
  46. ; ---THIS INSTRUCTION MUST BE AT 2809H OR 'FASM' MUST BE
  47. ; NOTIFIED OF THE CHANGE. 'FASM' INITIALIZES A JUMP AT 100
  48. ; IN THE .FEX FILE TO COME HERE FOR USE WITH CARTOONS WHICH
  49. ; INCLUDE EXEC IN ONE HUGE .COM FILE.
  50. ;
  51.     LXI    SP,STACK
  52. ;
  53. * TURN ON THE DISPLAY.
  54.     CALL    DISPON
  55.     SUB    A
  56.     STA    RATE    ;INITIALIZE RATE TO ZERO.
  57. *
  58. * THE FOLLOWING THREE INSTRUCTIONS ARE VERY TRICKY, BUT ALSO VERY
  59. * USEFUL.  THE CALL JUMPS AROUND THE OTHER TWO, WHILE PUTTING ITS
  60. * RETURN ADDRESS ON THE STACK.  WHEN A "RET" IS EXECUTED BY AN 
  61. * OPERATOR, WE WILL RETURN TO THE SECOND INSTRUCTION OF THE THREE.
  62. * THE SECOND AND THIRD INSTRUCTIONS RESET THE STACK POINTER SO 
  63. * THAT ANOTHER "RET"  WILL RETURN US TO THE SAME PLACE.
  64. * IN OTHER WORDS, WE HAVE A FAST WAY TO DO MULTIPLE JUMPS TO
  65. * A PARTICULAR ADDRESS.
  66.     CALL    RESTRT    ;SET RETURN ADDRESS AND SKIP NEXT 2 INSTS.
  67.     DCX    SP    ;RESET RETUURN  ADDRESS
  68.     DCX    SP
  69. RESTRT:    LHLD    FPC    ;GET FELIX PROGRAM COUNTER
  70.     MOV    E,M    ;GET CURRENT OP CODE
  71.     INX    H    ;UPDATE FPC AND STORE IT
  72.     SHLD    FPC
  73.     LDA    TRFLAG
  74.     ORA    A
  75.     CNZ    TRACE    ;TRACE EXECUTION IF WANTED
  76.     LDA    RATE
  77.     ORA    A
  78.     CNZ    DELAY    
  79. ;
  80. ; CHECK FOR CHARACTER INPUT.
  81. ;
  82.     CALL    CONSTAT
  83.     ORA    A    ;SET FLAGS
  84.     JZ    HOP    ;NOTHING INCOMING.
  85. ;
  86.         CALL    CI    ;GET CHARACTER.
  87.         CPI    03H    ;IS IT CTRL/C?
  88.         JNZ    STORCHAR
  89. ;
  90. ; CTRL/C; END OPERATIONS, GO AWAY.
  91. ;
  92.     CALL    DISPOFF
  93.     JMP    CPM
  94. ;
  95. STORCHAR:MOV    C,A
  96.     LDA    CHAR    ;SEE IF WE ALREADY HAVE A CHARACTER.
  97.     ORA    A
  98.     JNZ    BEEP    ;YES; BEEP TO REPORT OVERRUN.
  99. ;
  100. ; PUT DOWN THE NEW CHARACTER
  101. ;
  102.     MOV    A,C    ;GET IT BACK
  103.     STA    CHAR
  104.     JMP    HOP
  105. ;
  106. BEEP:    MVI    A,07H    ;BELL CHAR.
  107.     CALL    CO    ;PUT IT OUT
  108. ;
  109. HOP:    MVI    D,0    ;MAKE OP CODE AN INDEX INTO A TABLE
  110.     XCHG        ;OF OPERATOR ADDRESSES
  111.     DAD    H
  112.     LXI    D,OPTAB    ;GET BASE ADDRESS OF TABLE
  113.     DAD    D    ;ADD BASE TO DISPLACEMENT
  114.     MOV    E,M    ;GET ADDRESS OF DESIRED OPERATOR OUT OF 
  115.     INX    H    ;TABLE
  116.     MOV    D,M
  117.     XCHG        ;GET ADDRESS INTO HL SO WE CAN...
  118.     PCHL
  119. * THIS ROUTINE "TRACES" THE EXECUTION OF THE CURRENT FELIX PROGRAM
  120. * HL IS ASSUMED TO CONTAIN VALUE OF FPC PLUS ONE
  121. * E IS ASSUMED TO CONTAIN THE CURRENT OP CODE
  122. TRACE:    DCX    H    ;ADJUST FPC
  123.     CALL    DISPHL    ;DISPLAY IT
  124.     LXI    H,ARROW
  125.     CALL    PRINT
  126.     MOV    A,E
  127.     CALL    HEXPRT    ;DISPLAY CURRENT OP-CODE
  128.     CALL    CRLF
  129.     RET
  130. ARROW    DB    '=>',STOP
  131. ; DELAY WAITS 1 MILLISECOND FOR EACH COUNT-DOWN OF ACCUM
  132. ; ULATOR...FOR SLOWING AN ANIMATION. SEE ALSO RATE-OP.
  133. ;
  134. DELAY:    PUSH    H
  135. DEREGO:    MVI    H,55    ;1 MILLISEC.DELAY.
  136. DELOOP:    PUSH    H
  137.     POP    H    ;TIME WASTERS
  138.     DCR    H
  139.     JNZ    DELOOP
  140.     DCR    A
  141.     JNZ    DEREGO
  142.     POP    H
  143.     RET
  144. ; JUMP OPERATORS
  145. ;
  146. ; NOTE: ALL JMPS (OPCODES E0 THROUGH FE) USE TWO BYTES
  147. ; AFTEER OPCODE AS ADDR (LO-HI)0WITHOUT INPAR HELP.
  148. ;
  149. JUMPPL:    LDA    FLAGS
  150.     ANI    80H
  151.     JNZ    NOJUMP
  152.     JMP    JUMP
  153. JUMPMI:    LDA    FLAGS
  154.     ANI    80H
  155.     JZ    NOJUMP
  156.     JMP    JUMP
  157. JUMPNZ:    LDA    FLAGS
  158.     ANI    40H
  159.     JNZ    NOJUMP
  160.     JMP    JUMP
  161. JUMPZ:    LDA    FLAGS
  162.     ANI    40H
  163.     JZ    NOJUMP
  164.     JMP    JUMP
  165. JUMPNC:    LDA    FLAGS
  166.     ANI    02H
  167.     JNZ    NOJUMP
  168.     JMP    JUMP
  169. JUMPC:    LDA    FLAGS
  170.     ANI    02H
  171.     JZ    NOJUMP
  172.     JMP    JUMP
  173. ; HERE'S THE ACTUAL JUMPER:
  174. ;
  175. JUMP:    LHLD    FPC
  176.     MOV    E,M
  177.     INX    H
  178.     MOV    D,M
  179.     XCHG
  180.     SHLD    FPC
  181.     RET        ;BACK TO EXEC
  182. ;
  183. ; HERE'S THE VERY SIMILAR NOJUMPER:
  184. ;
  185. NOJUMP:    LHLD    FPC
  186.     INX    H
  187.     INX    H
  188.     SHLD    FPC    ;AVOID THE JUMP ADDRESS.
  189.     RET
  190. ; NEW FLOCK OF CALL&ETC.OPS, 4/79. USE FELIX'S OWN STACK.
  191. ; DESIGN BY SCHULZ,PROGRAM BY MOSHELL.
  192. ;
  193. ; A COUPLE OF REALLY TRIVIAL OPS,EH?
  194. ;
  195. PUSHOP:    CALL    INPAR
  196.     CALL    FPUSH
  197.     RET
  198. POPOP:    CALL    FPOP
  199.     CALL    OUTPAR
  200.     RET
  201. ;
  202. ; AND A SUBTLE ONE.
  203. ;
  204. CALLOP: LHLD    FPC
  205.     MOV    E,M
  206.     INX    H
  207.     MOV    D,M    ;DE HAS CALLED-ROUTINE-ADDRESS.
  208.     INX    H
  209.     XCHG        ;HL HAS CALLED-ROUTINE-ADDRESS.
  210.     SHLD    FPC    ;SO STASH IT IN FPC.
  211.     CALL    FPUSH    ;DE HAS RETURN ADDRESS;PUSH IT.
  212.     RET        ;AND GO BACK TO EXEC.
  213. ;
  214. RETOP:    CALL    FPOP    ;SO DE HAS RETURN ADDR.
  215.     XCHG
  216.     SHLD    FPC    ;AND NOW FPC HAS IT.
  217.     RET
  218. ;
  219. ;
  220. ;
  221. ; BACKGRND FILLS BACK-BUFF WITH GIVEN (INPAR) COLOR.
  222. ;
  223. BACKOP:    CALL    INPAR    ;E NOW HAS COLOR.
  224.     LHLD    BACKGRND
  225.     MOV    A,E
  226.     RRC
  227.     RRC
  228.     RRC
  229.     RRC
  230.     ORA    E
  231.     MOV    E,A
  232.     LXI    B,800H    ;LENGTH OF BUFFER.
  233. BLOOP:    MOV    M,E
  234.     INX    H
  235.     DCX    B
  236.     MOV    A,B
  237.     ORA    C
  238.     JNZ    BLOOP
  239.     RET
  240. ;
  241. ;
  242. ; DELAY OPERATOR ... JUST SETS THE RATE VALUE,THAT:S ALL.
  243. ;
  244. DELAYOP:    CALL    INPAR
  245.     MOV    A,E
  246.     STA    RATE
  247.     RET
  248. ; HALT OP...
  249. ;
  250. HALTOP: CALL    DISPOFF
  251.     JMP    0H    ;RETURN TO CP/M.
  252. ;
  253. ;
  254. ;
  255. ;
  256. ; ILLEGAL OPERATOR OPERATOR
  257. ;
  258. PRINT    EQU    502DH
  259. CR    EQU    0DH
  260. LF    EQU    0AH
  261. STOP    EQU    '$'
  262. DISPHL    EQU    5045H
  263. * THIS NEW ROUTINE IS BY LEE WITTENBERG (JUNE 19, 1979)
  264. * IT DISPLAYS AN ERROR MESSAGE AND THE ADDRESS OF AN
  265. * ILLEGAL OP-CODE WHICH HAS JUST BEEN "EXECUTED"
  266. NO$OP:    LHLD    FPC    ;ADDRESS OF OFFENDING OP-CODE IS
  267.     DCX    H    ;FPC - 1
  268.     CALL    DISPHL    ;DISPLAY IT
  269.     LXI    H,NOPMSG
  270.     CALL    PRINT    ;FOLLOWED BY ERROR MESSAGE
  271.     RET
  272. NOPMSG    DB    '<--ILLEGAL OPERATOR CODE ENCOUNTERED',CR,LF,STOP
  273. **********************************************************
  274. * OPCODES TABLE
  275. *
  276. ***********************************************************
  277. ;
  278. OPTAB:    EQU    $
  279.     DW    HALTOP    ;HALT    (00)
  280.     DW    2BD0H    ;SHOW    (01)
  281.     DW    PUSHOP    ;PUSH    (02)
  282.     DW    POPOP    ;POP    (03)
  283.     DW    RETOP    ;RETURN    (04)
  284.     DW    DELAYOP    ;DELAY    (05)
  285.     DW    2C50H    ;ONLIST    (06)
  286.     DW    2DB0H    ;POSIT    (07)
  287.     DW    2E30H    ;FLY    (08)
  288.     DW    BACKOP    ;NEWBACK(09)
  289.     DW    54E0H    ;SPIN    (0A)
  290.     DW    5500H    ;SETANGL(0B)
  291.     DW    NO$OP    ;TURN    (0C)--NOT YET IMPLEMENTED. (NYI)
  292.     DW    2E70H    ;DIST    (0D)
  293.     DW    2E50H    ;WHERE    (0E)
  294.     DW    2C80H    ;BACKGRND(0F)
  295. ; ARITHMETIC OPS - - - - - - - - - -
  296.     ORG    OPTAB+(2*10H)
  297.     DW    5302H    ;MOVE    (10)
  298.     DW    5350H    ;COMP    (11)
  299.     DW    5340H    ;COMPU    (12)
  300.     DW    53E0H    ;ADD    (13)
  301.     DW    53F0H    ;SUB    (14)
  302.     DW    NO$OP    ;AND    (15)--NYI
  303.     DW    NO$OP    ;OR    (16)--NYI
  304.     DW    NO$OP    ;XOR    (17)--NYI
  305.     DW    NO$OP    ;SHIFT    (18)--NYI
  306.     DW    NO$OP    ;ROTATE    (19)--NYI
  307.     DW    NO$OP    ;MUL    (1A)--NYI
  308.     DW    NO$OP    ;DIV    (1B)--NYI
  309. ; MISC. OPS
  310.     DW    2F50H    ;RESCALE(1C)
  311.     DW    2CA0H    ;RECOLOR(1D)
  312.     DW    NO$OP    ;TURNON    (1E)--NYI
  313.     DW    NO$OP    ;TURNOFF(1F)--NYI
  314. ; FELIX PRIMITIVES - - - - - - - - -
  315.     ORG    OPTAB+(2*20H)
  316.     DW    2B80H    ;PUT    (20)
  317.     DW    2B8FH    ;GET    (21)
  318.     DW    2BA0H    ;OBJR    (22)
  319.     DW    2BB1H    ;OBJW    (23)
  320.     DW    5620H    ;PATH    (24)
  321.     DW    5690H    ;PRINT(25)
  322.     DW    NO$OP    ;COUNT(26)
  323.     DW    NO$OP    ;ENDCOUNT(27)
  324.  
  325. ;
  326. ; WE HAVE THE UNASSIGNED OPERATORS CALL THE ERROR
  327. ; ROUTINE.
  328. ;
  329.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  330.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  331.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  332.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  333.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  334.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  335.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  336.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  337.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  338.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  339.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  340.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  341.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  342.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  343.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  344.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  345.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  346.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  347.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  348.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  349.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  350.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  351.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  352. ; JUMP AND CALL OPS - - - - - - - -
  353.     ORG    OPTAB+(2*0E0H)
  354.     DW    JUMP    ;JUMP    (E0)
  355.     DW    JUMPPL    ;JPL    (E1)
  356.     DW    JUMPMI    ;JMI    (E2)
  357.     DW    JUMPNZ    ;JNZ    (E3)
  358.     DW    JUMPZ    ;JZ    (E4)
  359.     DW    JUMPNC    ;JNC    (E5)
  360.     DW    JUMPC    ;JC    (E6)
  361.     DW    CALLOP    ;CALL    (E7)
  362.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  363.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  364.     DW    NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP,NO$OP
  365. ENDTAB:    ORG    OPTAB+200H
  366.