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

  1. ;16 MAR 79,MOSHELL: REMOVE STTACK-INIT.IN 'MOVE'.
  2. ;************************************************************************
  3. ;
  4. ; NUMBER GROUP * MOVE, COMP, COMPU, ADD, SUBT *
  5. ;   1/79       * JANE KIENINGER
  6. ;
  7. ;
  8. ;  NOTES:
  9. ;    1.  WHEN AN 8 BIT PARAMETER IS PROCESSED AGAINST A 16 BIT PARAMETER,
  10. ;        THE 8 BIT PARAMETER IS TREATED LIKE A 16 BIT PARAMETER
  11. ;        WITH 0'S IN THE HIGH ORDER 8 BITS - FLAGS AND PROCESSING
  12. ;        PROGRESS AS IF BOTH WERE 16 BITS (MOVE ROUTINE IS NOT
  13. ;        AFFECTED).
  14. ;    2.  COMPARE - USE 'COMP' TO COMPARE SIGNED INTEGERS, USE 'COMPU'
  15. ;        TO COMPARE UNSIGNED.
  16. ;    3.  ADD - TO DETECT A RESULT WHICH HAS EXCEEDED STORAGE ALLOWED:
  17. ;        A. CHECK CARRY FLAG FOR UNSIGNED INTEGERS.
  18. ;        B. CHECK OVERFLOW FLAG FOR SIGNED INTEGERS.
  19. ;    4.  SUBT - 
  20. ;        A. FOR UNSIGNED INTEGERS CHECK CARRY FLAG TO DETECT A
  21. ;            NEGATIVE RESULT.
  22. ;        B. FOR SIGNED INTEGERS CHECK OVERFLOW FLAG TO DETECT A RESULT
  23. ;            WHICH HAS EXCEEDED STORAGE ALLOWED.
  24. ;    5.  MINUS FLAG - IS SET:
  25. ;        A.  IN ADD, SUB OR MOVE ROUTINES TO INDICATE THAT THE
  26. ;            RESULLT (OR PARAMETER OF 'MOVE') IS NEGATIVE - TO
  27. ;            BE USED WITH SIGNED INTEGERS ONLY.
  28. ;        B.  IN COMP, TO INDICATE THAT THE SECOND PARAMETER IS GREATER
  29. ;            THAN THE FIRST WHEN DEALING WITH SIGNED INTEGERS.
  30. ;        C.  IN COMPU, TO INDICATE THAT THE SECOND PARAMETER IS
  31. ;            GREATER THAN THE FIRST WHEN DEALING WITH
  32. ;            UNSIGNED INTEGERS.
  33. ;
  34. ;    6.  WARNING - IF SIGNED AND UNSIGNED PARAMETERS ARE INADVERTANTLY
  35. ;        MIXED, RESULTS AND FLAGS ARE UNPREDICTABLE.
  36. ;
  37. ;;************************************************************************
  38. INPARM    EQU    5030H
  39. OUTPRM    EQU    5033H
  40. FLAGS    EQU    0114H    ;(*REGISTER #2)
  41. MFLAG    EQU    80H    ; LOCATION OF MINUS FLAG (BIT 7)
  42. OFFM    EQU    7FH    ; TO TURN OFF MINUS FLAG
  43. ZFLAG    EQU    40H    ; LOCATION OF ZERO FLAG  (BIT 6)
  44. OFFZ    EQU    0BFH    ; TO TURN OFF ZERO FLAG
  45. ZAPFLAG EQU    3FH    ; TO TURN OFF BOTH ZERO AND MINUS (BIT 6 AND 7)
  46. CFG    EQU    02H    ; TO TURN ON  CARRY FLAG (BIT 1)
  47. OFG    EQU    08H    ; TO TURN ON OVERFLOW FLAG (BIT 3)
  48. ZAPALL    EQU    35H    ; TO TURN OFF ALL FELIX FLAGS (BITS 1,3,6,7)
  49. ON    EQU    0FFH    ; USED TO TURN INTERNAL FLAG ON
  50. ZERO    EQU    00H    ;
  51.     ORG    5300H
  52. RESULT    DB    00H    ; TEMPORARY SAVE AREA FOR COMPUTATIONAL RESULTS
  53. RTSW    DB    00H    ; ROUTINE SWITCH
  54. ;*************************************************************************
  55. ;
  56. ; MOVE     * MOVE ROUTINE * J-2LANE KIENINGER
  57. ;    *     1/79     * VERSION 1.1
  58. ;
  59. ;  DESCR:   THIS ROUTINE EXAMINES THE FIRST PARAMETER AND
  60. ;    SETS MINUS AND ZERO (FELIX) FLAGS AS NECESSARY.  
  61. ;    IT TESTS THE SIGN FLAG SET BY INPARM TO DETERMINE WHETHER 8 OR
  62. ;    16 BITS SHOULD BE EXAMINED.  OUTPRM ACTUALLY MOVE THE VALUE TO A
  63. ;    NEW VARIABLE.
  64. ;  INPUT:  REGISTERS D AND E FROM INPARM.
  65. ;  OUTPUT: REGISTERS D AND E TO OUTPRM.
  66. ;  SUBROUTINES:  INPARM, OUTPRM
  67. ;  REGISTERS DESTROYED: A AND B
  68. ;
  69. ;****************************************************************************
  70. MOVE:    LDA    FLAGS    ; ZERO FLAGS
  71.     ANI    ZAPFLAG    
  72.     STA    FLAGS
  73.     MVI    B,00H    ; ZERO B USED TO INDICATE 16 BIT PARAMETER SIZE
  74.     CALL    INPARM    ; GET PARAMETER
  75.     JC    BIT16    ; IF CARRY FLAG SET, PARAMETER SIZE IS 16 BITS
  76. ;
  77. ;  SET MINUS FLAG FOR 8-BIT IF NEGATIVE
  78. ;
  79.     MOV    A,E    ; IF E IS NEGATIVE 
  80.     CPI    0H    ;     SET MINUS FLAG TEMPORARILY IN B
  81.     JP    CKZERO    
  82.     MVI    B,MFLAG
  83.     JMP    CKZERO
  84. ;
  85. ;  SET MINUS FLAG FOR 16 BIT IF NECESSARY
  86. ;
  87. BIT16:    MOV    A,D    ; IF D IS NEGATIVE SET TEMPORARY MINUS FLAG IN B
  88.     CPI    0H    ;
  89.     JP    CKZERO
  90.     MVI    B,MFLAG
  91. CKZERO: MOV     A,D    ; CHECK TO SEE IF VALUE =0
  92.     ORA    E
  93.     LDA    FLAGS    ;  UPDATE FLAGS
  94.     JNZ    MVEND
  95.     ORI    ZFLAG    ; SET ZERO FLAG
  96. MVEND:  ORA    B    ; SET MINUS FLAG FROM B
  97.     STA    FLAGS    ; RESTORE FLAGS
  98.     CALL    OUTPRM    ; CALL OUTPRM TO GET VALUE TO BE MOVED
  99.     RET
  100. ;********************************************************************
  101. ; COMP/COMPU * COMPARE SIGNED (COMP) AND COMPARE UNSIGNED (COMPU) ROUTINES *
  102. ;      * JANE KIENINGER
  103. ;      *      1/79       * VERSION 1.1
  104. ;
  105. ; DESCR:  THIS ROUTINE COMPARES THE SECOND PARAMETER VALUE FROM
  106. ;    THE FIRST.  IF THE SECOND VALUE IS GREATER THAN THE FIRST THE
  107. ;    FELIX MINUS FLAG IS SET AND IF THE RESULT IS ZERO (THE VALUES
  108. ;    ARE EQUAL) THE FELIX ZERO FLAG IS SET.  THE MINUS FLAG IS
  109. ;    SET BASED ON THE 16 BITS OF THE RESULT EXCEPT WHEN BOTH
  110. ;    PARAMETER VALUES ARE 8 BITS AS INDICATED BY THE CARRY FLAG
  111. ;    SET BY INPARM - IN THAT CASE  THE MINUS FLAG IS SET BASED
  112. ;    ON THE LOWER 8 BITS OF DE.
  113. ;      COMP SETS THE FLAGS ASSUMING BOTH PARAMETERS ARE SIGNED
  114. ;    INTEGERS WHILE COMPU SETS THE FLAGS ASSUMING THEY ARE UNSIGNED
  115. ;    INTEGERS.  THE ENTRY POINT INTO THIS ROUTINE DETERMINES WHETHER
  116. ;    IT WILL DO A SIGNED OR UNSIGNED COMPARE.  A ROUTINE FLAG IS SET
  117. ;    (RTSW) TO 00 FOR UNSIGNED AND FF FOR SINGED.
  118. ; INPUT:  REGISTERS D AND E FROM INPARM
  119. ; OUTPUT:   FELIX FLAGS ZERO (BIT 6) AND MINUS (BIT 7) SET
  120. ; SUBROUTINES:  INPARM
  121. ; REGISTERS DESTROYED: ALL
  122. ;
  123. ;***************************************************************************
  124.     ORG    5340H
  125. ;
  126. ;  UNSIGNED COMPARE ROUTINE START POINT
  127. ;
  128. CKMPU:    XRA    A    ; SET ROUTINNE SWITCH TO 0
  129.     STA    RTSW    ;
  130.     JMP    C0    ;
  131. ;
  132. ;  SIGNED COMPARE ROUTINE START POINT
  133. ;
  134.     ORG    5350H
  135. COMP:    ORI    ON    ; SET ROUTINE SWITCH TO FF TO INDICATE
  136.     STA    RTSW    ;    SIGNED NUMBERS.
  137. ; BEGIN COMPARE ROUTINE
  138. ;
  139. C0:    LDA    FLAGS    ; ZERO FLAGS
  140.     ANI    ZAPFLAG 
  141.     STA    FLAGS
  142.     MVI    B,00H    ; ZERO REGISTERS
  143.     MVI    C,00H    ; 
  144. ;
  145. ;  GET PARAMETERS - SET 16 BIT FLAG IN B IF EITHER IS 16 BITS LONG
  146. ;
  147.     CALL    INPARM    ; GET FIRST PARAMETER TO BE COMPARED
  148.     JNC    C1    ; IF CARRY FLAG IS SET, SET
  149.     MVI    B,ON    ;    16 BIT FLAG IN REG B
  150. C1:    XCHG        ; MOVE VALUE OF FIRST PARM INTO HL
  151.     CALL    INPARM    ; GET SECOND PARAMETER
  152.     JNC    C2    ; IF CARRY FLAG SET, SET
  153.     MVI    B,ON    ;    16 BIT FLAG IN REG B.
  154. ;
  155. ;  8 BIT PROCESSING
  156. ;
  157. C2:     MOV    A,L    ; COMPARE L AND E
  158.     CMP    E
  159.     RAL        ; PUT CARRY BIT IN LOW ORDER BIT OF ACCUM
  160.     MOV    C,A    ;     SAVE CARRY IN C
  161.     JNZ    C3    ; IF ZERO SET ZERO FLAG AND BYPASS CARRY CHECK
  162.     LDA    FLAGS
  163.     ORI    ZFLAG
  164.     STA    FLAGS
  165.     JMP    C65
  166. C3:    CALL     CSUBR1
  167. ;
  168. ;  IF BOTH VALUES ARE 8 BITS END PROCESSING
  169. ;
  170. C65:    MOV    A,B    ; B = 16 BIT FLAG
  171.     CPI    ON    ; IF FLAG ON?
  172.     JNZ    CEND    ; IF NOT, END PROCESSING
  173. ;
  174. ;   16-BIT PROCESSING
  175. C7:    MOV    E,D    ; MOVE D TO E AND H TO L TO SET UP
  176.     MOV    L,H    ;    UP FOR SUBROUTINE CALL
  177.     MOV    A,L    ; COMPARE H & D
  178.     CMP    E
  179.     JZ    CEND    ; IF EQUAL THEN THE MINUS AND ZERO FLAGS ALREADY HAVE
  180.             ;    BEEN SET IN 8 BIT COMPARE.
  181.     RAL        ; PUT CARRY BIT IN LOW ORDER BIT OF ACCUM.
  182.     MOV    C,A    ; SAVE CARRY IN C
  183.     LDA    FLAGS    ; GET FELIX FLAGS
  184.     ANI    OFFZ    ; TURN OFF ZERO FLAG IF SET IN 8 BIT COMPARE
  185.     STA    FLAGS
  186.     CALL     CSUBR
  187. CEND:    RET
  188. ;**
  189. ;
  190. ; COMPARISON SUBROUTINE
  191. ;
  192. ;     SETS MINUS FLAG IF SECOND OPERAND GREATER THAN FIRST
  193. ;
  194. ;**
  195. CSUBR1: MOV    A,B    ; IF 16 BIT PROCESSING, SIGNED ROUTINE MUST
  196.     CPI    ON    ;    BE IGNORED DURING 8 BIT COMPARE
  197.     JZ    C4
  198. CSUBR:    LDA    RTSW    ; IF SIGNED NO. (IF ON), THEN MUST
  199.     CPI    ON    ;    CHECK SIGNS.
  200.     JNZ    C4    ;    ELSE BYPASS SECTION.
  201. ;**
  202. ;  SIGNED NUMBER SPECIAL ROUTINE
  203. ;
  204.     PUSH     B    ; SAVE REGISTERS
  205.     MOV    A,E    ; TURN OFF ALL BUT SIGN BIT IN E
  206.     ANI    80H    ;
  207.     MOV    C,A    ; SAVE IN C
  208.     MOV    A,L    ; TURN OFF ALL BUT SIGN BIT IN H
  209.     ANI    80H
  210.     CMP    C    ; COMPARE TWO SIGNS
  211.     POP    B    ; RESTORE BC
  212.     MOV    A,C    ; LOW BIT OF C CONTAINS CARRY
  213.     JZ    C4    ; IF UNEQUAL COMPLEMENT CARRY
  214.     RAR        ; PUT CARRY BACK
  215.     CMC        ; COMPLEMENT CARRY
  216.     JMP    C5    
  217. C4:    MOV    A,C    ; LOW BIT OF C CONTAINS CARRY
  218.     RAR
  219. C5:    LDA    FLAGS    ; GET FELIX FLAGS
  220.     JNC    C55    ; IF CARRY, SET MINUS FLAG
  221.     ORI    MFLAG    ; SET MINUS FELIX FLAG
  222.     JMP    C6
  223. C55:    ANI    OFFM    ; TURN OFF MINUS IF SET IN 8 BIT COMPARE
  224. C6:    STA    FLAGS    ; RETURN FELIX FLAGS
  225.     RET
  226. ;******************************************************************************
  227. ;
  228. ; ADD/SUB * ADD AND SUBTRACT ROUTINE * JANE KIENINGER
  229. ;         *         1/79             * VERSION 1.1
  230. ;
  231. ; DESCR:  THIS ROUTINE ADDS THE FIRST PARAMETER TO THE SECOND, OR
  232. ;    SUBTRACTS THE SECOND FROM THE FIRST, AND PLACES THE RESULT
  233. ;    IN THE THIRD.  THE ENTRY POINT INTO THIS ROUTINE DETERMINES
  234. ;    WHETHER IT WILL ADD OR SUBTRACT.  A ROUTINE FLAG (RTSW) IS SET TO
  235. ;    00 FOR ADD AND FF FOR SUBTRACT.  THE ROUTINE USES INPARM AND OUTPRM
  236. ;    FOR INPUT AND OUTPUT OF PARAMETERS AND SETS FELIX FLAGS.  THE
  237. ;    MINUS FLAG IS SET BASED ON THE 16 BITS OF THE RESULT EXCEPT WHEN
  238. ;    BOTH PARAMETER VALUES ARE 8 BITS (AS INDICATED BY THE CARRY FLAG
  239. ;    SET BY INPARM), WHEN THAT OCCURS THE MINUS FLAG IS SET BASED
  240. ;    ON AN 8 BIT RESULT.
  241. ; INPUT:  REGISTERS D AND E FROM INPARM
  242. ; OUPUT:  REGISTERS D AND E FOR OUTPRM AND FELIX FLAGS: ZERO (BIT 6),
  243. ;    MINUS (7), CARRY (1), OVERFLOW (3)
  244. ; SUBROUTINES:  INPARM, OUTPRM
  245. ; REGISTERS DESTROYED:  ALL
  246. ;
  247. ;******************************************************************************
  248.     ORG    53E0H
  249. ;
  250. ;  ADD ROUTINE START POINT
  251. ;
  252. ADDIT:  XRA    A    ; SET ROUTINNE SWITCH TO 0 TO INDICATE
  253.     STA    RTSW    ;    ADD ROUTINE.
  254.     JMP    A1
  255. ;
  256. ;  SUBTRACT ROUTINE START POINT
  257. ;
  258.     ORG    53F0H
  259. SUBIT:    ORI    ON    ; SET ROUTINE SWITCH TO FF TO INDICATE SUBTRACT
  260.     STA    RTSW    ;       ROUTINE.
  261. ;
  262. ;    BEGIN
  263. ;
  264. A1:    LDA    FLAGS    ; ZERO FLAGS AND REGISTERS.
  265.     ANI    ZAPALL
  266.     STA    FLAGS    ;
  267.     MVI    C,00H
  268.     MVI    B,00H
  269. ;
  270. ; GET PARAMETERS - SET 16 BIT FLAG IN REG B IF EITHER IS 16 BITS LONG
  271. ;
  272.     CALL    INPARM    ; 1ST PARAMETER PLACED IN DE
  273.     JNC    A5    ; IF CARRY FLAG SET, SET
  274.     MVI    B,ON    ;   16 BIT FLAG IN REG B
  275. A5:    XCHG        ; 1ST PARAMETER NOW IN HL
  276.     CALL    INPARM    ; 2ND PARAMETER IN DE
  277.     JNC    A10    ; IS CARRY FLAG SET, SET
  278.     MVI    B,ON    ;    16 BIT FLAG IN REG B
  279. ;
  280. ; 8-BIT PROCESSING
  281. ;
  282. A10:    LDA    RTSW    ; IS THIS ADD OR SUBTRACT ROUTINE?
  283.     CPI    ON    ; IF NOT ON THEN ADD ELSE SUBTRACT
  284.     JNZ    A15    ;
  285. *
  286. *  8 BIT SUBTRACTION
  287. *
  288.     MOV    A,L    ; SUBTRACT LOWER 8 BITS (E & L)
  289.     SUB    E    ;
  290.     STA    RESULT    ; STORE 8-BIT RESULT
  291.     PUSH    PSW    ; SAVE RESULTS AND FLAGS FOR LATER USE
  292.     MOV    A,B    ; IF 16 BIT PROCESSING, SKIP 8 BIT FLAG SETTINGS
  293.     CPI    ON
  294.     LDA    RESULT    ; ACCUMULATOR MUST CONTAIN RESULT FOR OVERFLOW
  295.                 ;     SUBROUTINE.
  296.     JZ    A31
  297.     CALL    SOVFLOW    ; SET 8 BIT OVERFLOW FLAG IN REG C IF NEC.
  298.     JMP    A20    ; BYPASS ADD ROUTINE.
  299. *
  300. *  8-BIT ADDITION
  301. *
  302. A15:    MOV    A,L    ; ADD LOWER 8 BITS (E & L)
  303.     ADD    E    ;
  304.     STA    RESULT    ; STORE 8 BIT RESULT
  305.     PUSH    PSW    ; SAVE RESULTS AND FLAGS FOR LATER USE
  306.     MOV    A,B    ; IF 16 BIT PROCESSING, SKIP 8 BIT FLAG SETTING
  307.     CPI    ON    ;
  308.     LDA    RESULT    ; ACCUMULATOR MUST CONTAIN RESULT FOR OVERFLOW
  309.             ;    SUBROUTINE.
  310.     JZ    A31    ;
  311.     CALL    OVFLOW    ; SET 8BIT OVERFLOW FLAG IN REG C
  312. A20:    POP    PSW    ; RECOVER RESULT AND FLAGS
  313.     MVI    A,ZERO    ; CLEAR ACCUMULATER (MUST USE MVI)
  314.     JNC    A25    ; SET  CARRY FLAG TEMPORARILY IN A
  315.     MVI    A,CFG    ;   IF CARRY SYSTEM FLAG SET
  316. A25:    JP    A30    ; SET FELIX MINUS FLAG TEMP WITH 8 BIT
  317.     ORI    MFLAG    ;   CARRY FLAG IN A IF RESULT WAS NEGATIVE
  318. A30:     ORA    C    ; ADD OVERFLOW FLAG TO CARRY AND MINUS
  319.     MOV    C,A    ; SAVE ALL FLAGS IN C
  320.     LDA    FLAGS    ; BRING IN FELIX FLAGS
  321.     ORA    C    ; SET 8-BIT OVERFLOW, CARRY AND MINUS PERMANNENTLY
  322.     STA    FLAGS
  323.     JMP    A60    ; SKIP TO SET ZERO FLAG
  324. ;
  325. ; 16 BIT PROCESSING
  326. ;
  327. ;
  328. A31:    LDA    RTSW    ; IF THIS ADD OR SUBTRACT ROUTINE ?
  329.     CPI    ON    ; IF NOT ON THEN ADD ELSE SUBTRACT
  330.     JNZ    A35    ;
  331. *
  332. *  16 BIT SUBTRACTION
  333. *
  334.     POP    PSW    ; RESTORE CARRY FLAG
  335. A32:    MOV    A,H    ; SUBTRACT TOP 8 BITS (H & D) WITH BORROW FROM
  336.     SBB    D    ;     LOWER 8 BITS.
  337.     MOV    E,D    ; MOVE D TO E AND H TO L TO PROPERLY USE 
  338.     MOV    L,H    ;    OVERFLOW ROUTINE.
  339.     PUSH    PSW    ; SAVE RESULT AND SYSTEM FLAGS
  340.     CALL    SOVFLOW    ; SETS OVERFLOW FLAG IN C IF ANY
  341.     JMP    A38    ; BYPASS ADD ROUTINE
  342. *
  343. *
  344. *  16 BIT ADDITION
  345. *
  346. A35:    POP    PSW    ; RESTORE CARRY FLAG
  347. A36:    MOV    A,H    ; ADD TOP 8-BITS (H & D) WITH CARRY FROM
  348.     ADC    D    ;     LOWER 8-BITS.
  349.     MOV    E,D    ; MOVE D TO E AND H TO L TO PROPERLY USE OVERFLOW
  350.     MOV    L,H    ;     ROUTINE.
  351.     PUSH    PSW    ; SAVE RESULT AND SYSTEM FLAGS.
  352.     CALL    OVFLOW  ; SETS OVERFLOW FLAG IN REG C (IF ANY)
  353. A38:    POP    PSW    ; RESTORE RESULT IN ACCUMULATOR AND ALL SYSTEM FLAGS
  354.     MOV    D,A    ; SAVE RESULT OF FUNCTION IN D
  355.     MVI    H,00H    ; CLEAR H
  356.     JNC    A40    ; SET  CARRY TEMP IN H IF SYSTEM 
  357.     MVI    H,CFG    ;    CARRY WAS SET
  358. A40:    LDA    FLAGS    ; BRING IN FELIX FLAGS
  359.     JP    A45    ; IF RESULT WAS NEGATIVE SET MINUS FLAG
  360.     ORI    MFLAG  ;      PERMANENTLY.
  361.     JMP    A50    ;
  362. A45:    ANI    OFFM    ; IF RESULT WAS POSITIVE RESET FLAG
  363. A50:     ORA    C    ; SET 16 BIT OVERFLOW FLAG PERMANENTLY
  364.     ORA    H    ; SET 16 BIT CARRY FLAG PERMANENTLY
  365.     STA    FLAGS    ; RETURN FELIX FLAGS TO MEMORY
  366. ;
  367. ; SET ZERO FLAG
  368. ;
  369. A60:    LDA    RESULT ; READ IN 8 BIT PROCESSING RESULTS
  370.     MOV    E,A    ; STORE THIS RESULT PERMANENTLY IN E
  371.     ORA    D    ; COMPARE IT WITH 16-BIT RESULTS
  372.     JNZ    A65    ; IF RESULT = 0 SET ZERO FLAGS
  373.     LDA    FLAGS    ;
  374.     ORI    ZFLAG    ;
  375.     STA    FLAGS    ; RETURN FELIX FLAGS TO MEMORY FOR LAST TIME
  376. A65:    CALL    OUTPRM
  377.     RET
  378. ;
  379. ; OVFLOW * OVERFLOW SUBROUTINE FOR ADD *
  380. ;
  381. ; DESCR: THIS SUBROUTINE SETS THE FELIX OVERFLOW FLAG IF BOTH OPERANDS ARE
  382. ;     THE SAME SIGN AND THE RESULT IS OF THE OPPOSITE SIGN. THE CODING HAS
  383. ;     THE ORDER OF THIS REVERSED FOR EFFICIENCY.  AT THE END OF THE 
  384. ;     ROUTINE REGISTER C CONTAINS AN 8 BIT OVERFLOW FLAG CONFIGURATION.
  385. ; REGISTERS: REG A - RESULT OF ADDITION (INITIALLY ONLY)
  386. ;            REG E - SECOND OPERAND
  387. ;         REG L - FIRST OPERAND
  388. ;         REG C - ALL ZEROS OR 8 BIT OVERFLOW FLAG CONFIGURATION
  389. ;                    (AT  END OF SUBROUTINE)
  390. ;;;
  391. ; 1.  COMPARE SIGN BITS OF RESULT (A) WITH OPERAND IN E.  IF = THEN
  392. ;     NO OVERFLOW.
  393. ;
  394. OVFLOW:    ANI    80H    ; TURN OFF ALL BUT SIGN BIT IN RESULT
  395.     MOV    C,A    ; SAVE THIS
  396.     MOV    A,E    ; NOW BRING IN OPERAND IN E AND TURN OFF
  397.     ANI     80H    ;     ALL BUT SIGN BIT.
  398.     CMP    C    ; COMPARE SIGN BIT OF RESULT WITH OPERAND FROM E
  399.     JZ    F15    ; IF SIGNS ARE EQUAL THEN NO OVERFLOW
  400. ;
  401. ; 2.  NOW COMPARE SIGN BIT OF OPERAND FROM E WITH THAT OF L.
  402. ;
  403.     MOV    C,A    ; SAVE E'S SIGN
  404.     MOV    A,L    ; BRING IN L AND TURN OFF ALL BUT SIGN BIT
  405.     ANI    80H    ; 
  406.     CMP    C    ; COMPPARE SIGN BIT OF E WITH L
  407.     JNZ    F15    ; IF EQUAL SET OVERFLOW FLAG TEMPORARILY
  408.     MVI    C,OFG  ;    IN C.
  409.     JMP    F20    ; BYPASS CLEARING C.
  410. F15:    MVI    C,00H    ; CLEAR C FOR FLAG USE
  411. F20:    RET
  412. ;
  413. ; SOVFLOW * OVERFLOW SUBROUTINE FOR SUBTRACT *
  414. ;
  415. ; DESCR:  THIS SUBROUTINE SETS THE FELIX OVERFLOW FLAG IF THE SIGNS
  416. ;    OF THE OPERANDS DIFFER AND THE RESULT SIGN IS THE SAME AS THE
  417. ;    SIGN OF THE SECOND OPERAND.  THE CODING HAS THE ORDER OF THIS
  418. ;    REVERSED FOR EFFICIENCY.  AT THE END OF THE ROUTINE REGISTER C 
  419. ;    CONTAINS AN 8 BIT OVERFLOW FLAG CONFIGURATION.
  420. ; REGISTERS:    REG A - RESULT OF SUBRACTION (INITIALLY ONLY)
  421. ;        REG L - FIRST OPERAND
  422. ;        REG E - SECOND OPERAND
  423. ;        REG C - ALL ZEROS OR 8 BIT OVERFLOW FLAG CONFIGURATION
  424. ;            AT END OF SUBROUTINE.
  425. ;
  426. ; 1.  COMPARE SIGN BITS OF RESULT (A) WITH OPERAND IN E.  IF UNEQUAL
  427. ;    THEN NO OVERFLOW.
  428. ;
  429. SOVFLOW:    ANI    80H    ; TURN OFF ALL BUT SIGNN BIT IN RESULT
  430.     MOV    C,A    ; SAVE THIS
  431.     MOV    A,E    ; NOW BRING IN OPERAND IN E AND TURN OFF
  432.     ANI    80H    ;    ALL BUT SIGN BIT.
  433.     CMP    C    ; COMPARE SIGN BIT OF RESULT WITH OPERAND FROM E.
  434.     JNZ    S15    ; IF SIGNS DIFFER THEN NO OVERFLOW.
  435. ;
  436. ; 2.  NOW COMPARE SIGNS OF TWO OPERANDS
  437. ;
  438.     MOV    C,A    ; SAVE E'S SIGNN
  439.     MOV    A,L    ; BRING IN L AND THRN OFF ALL BUT SIGN BIT
  440.     ANI    80H    ; 
  441.     CMP    C    ; COMPARE SIGN BIT OF E WITH L
  442.     JZ    S15    ; IF UNEQUAL SET OVERFLOW FLAG IN C
  443.     MVI    C,OFG    ;
  444.     JMP    S20    ; BY PASS CLEARING C
  445. S15:    MVI    C,00H    ; CLEAR C FOR FLAG USE
  446. S20:    RET
  447.