home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / UTILS / S / SMC21LIB.LZH / CALL.MAC < prev    next >
Text File  |  2000-06-30  |  10KB  |  523 lines

  1. ;
  2. ;----- call.asm:    Small-C ver. 2 arithmetic and logical library
  3. ;            (ASM Version 7-28-83, Bill Randle)
  4. ;            (Global symbols added 02-07-84, Dennis Quinn)
  5. ;            (.8080 added 10 Jan 85, Earl Boebert)
  6. ;        (Updated to version in the Handbook 4 Feb 85, Earl Boebert)
  7. ;
  8. .8080
  9. _call::    EXT _END
  10. ;
  11. CCDCAL::
  12.             PCHL
  13. ;
  14. CCDDGC::
  15.         DAD D
  16.         JMP CCGCHAR
  17.         ;
  18. CCDSGC::
  19.         INX H
  20.         INX H
  21.         DAD SP
  22.         ;
  23.         ;FETCH A SINGLE BYTE FROM THE ADDRESS IN HL AND
  24.         ;SIGN EXTEND INTO HL
  25.         ;
  26. CCGCHAR::
  27.         MOV A,M
  28.         ;
  29.         ;PUT THE ACCUM INTO HL AND SIGN EXTEND THROUGH H.
  30.         ;
  31. CCARGC::
  32. CCSXT::
  33.         MOV L,A
  34.         RLC
  35.         SBB A
  36.         MOV H,A
  37.         RET
  38.         ;
  39. CCDDGI::
  40.         DAD D
  41.         JMP CCGINT
  42.         ;
  43. CCDSGI::
  44.         INX H
  45.         INX H
  46.         DAD SP
  47.         ;
  48.         ;FETCH A FULL 16-BIT INTEGER FROM THE ADDRESS IN HL
  49.         ;INTO HL
  50.         ;
  51. CCGINT::
  52.         MOV A,M
  53.         INX H
  54.         MOV H,M
  55.         MOV L,A
  56.         RET
  57.         ;
  58. CCDECC::
  59.         INX H
  60.         INX H
  61.         DAD SP
  62.         MOV D,H
  63.         MOV E,L
  64.         CALL CCGCHAR
  65.         DCX H
  66.         MOV A,L
  67.         STAX D
  68.         RET
  69.         ;
  70. CCINCC::
  71.         INX H
  72.         INX H
  73.         DAD SP
  74.         MOV D,H
  75.         MOV E,L
  76.         CALL CCGCHAR
  77.         INX H
  78.         MOV A,L
  79.         STAX D
  80.         RET
  81.         ;
  82.         ;
  83. CCDDPC::
  84.         DAD D
  85. CCPDPC::
  86.         POP B           ;;RET ADDR
  87.         POP D
  88.         PUSH B
  89.         ;
  90.         ;STORE A SINGLE BYTE FROM HL AT THE ADDRESS IN DE
  91.         ;
  92. CCPCHAR::
  93. PCHAR::    MOV A,L
  94.         STAX D
  95.         RET
  96.         ;
  97. CCDECI::
  98.         INX H
  99.         INX H
  100.         DAD SP
  101.         MOV D,H
  102.         MOV E,L
  103.         CALL CCGINT
  104.         DCX H
  105.         JMP CCPINT
  106.         ;
  107. CCINCI::
  108.         INX H
  109.         INX H
  110.         DAD SP
  111.         MOV D,H
  112.         MOV E,L
  113.         CALL CCGINT
  114.         INX H
  115.         JMP CCPINT
  116.         ;
  117.         ;
  118. CCDDPI::
  119.         DAD D
  120. CCPDPI::
  121.         POP B           ;;RET ADDR
  122.         POP D
  123.         PUSH B
  124.         ;
  125.         ;STORE A 16-BIT INTEGER IN HL AT THE ADDRESS IN DE
  126.         ;
  127. CCPINT::
  128. PINT::    MOV A,L
  129.         STAX D
  130.         INX D
  131.         MOV A,H
  132.         STAX D
  133.         RET
  134.         ;
  135.         ;INCLUSIVE "OR" HL AND DE INTO HL
  136.         ;
  137. CCOR::
  138.         MOV A,L
  139.         ORA E
  140.         MOV L,A
  141.         MOV A,H
  142.         ORA D
  143.         MOV H,A
  144.         RET
  145.         ;
  146.         ;EXCLUSIVE "OR" HL AND DE INTO HL
  147.         ;
  148. CCXOR::
  149.         MOV A,L
  150.         XRA E
  151.         MOV L,A
  152.         MOV A,H
  153.         XRA D
  154.         MOV H,A
  155.         RET
  156.         ;
  157.         ;"AND" HL AND DE INTO HL
  158.         ;
  159. CCAND::
  160.         MOV A,L
  161.         ANA E
  162.         MOV L,A
  163.         MOV A,H
  164.         ANA D
  165.         MOV H,A
  166.         RET
  167.         ;
  168.         ;IN ALL THE FOLLOWING COMPARE ROUTINES, HL IS SET TO 1 IF THE
  169.         ;CONDITION IS TRUE, OTHERWISE IT IS SET TO 0 (ZERO).
  170.         ;
  171.         ;TEST IF HL = DE
  172.         ;
  173. CCEQ::
  174.         CALL CCCMP
  175.         RZ
  176.         DCX H
  177.         RET
  178.         ;
  179.         ;TEST IF DE <> HL
  180.         ;
  181. CCNE::
  182.         CALL CCCMP
  183.         RNZ
  184.         DCX H
  185.         RET
  186.         ;
  187.         ;TEST IF DE > HL (SIGNED)
  188.         ;
  189. CCGT::  
  190.         XCHG
  191.         CALL CCCMP
  192.         RC
  193.         DCX H
  194.         RET
  195.         ;
  196.         ;TEST IF DE <= HL (SIGNED)
  197.         ;
  198. CCLE::  
  199.         CALL CCCMP
  200.         RZ
  201.         RC
  202.         DCX H
  203.         RET
  204.         ;
  205.         ;TEST IF DE >= HL (SIGNED)
  206.         ;
  207. CCGE::  
  208.         CALL CCCMP
  209.         RNC
  210.         DCX H
  211.         RET
  212.         ;
  213.         ;TEST IF DE < HL (SIGNED)
  214.         ;
  215. CCLT::  
  216.         CALL CCCMP
  217.         RC
  218.         DCX H
  219.         RET
  220.         ;
  221.         ;COMMON ROUTINE TO PERFORM A SIGNED COMPARE
  222.         ; OF DE AND HL
  223.         ;THIS ROUTINE PERFORMS DE - HL AND SETS THE CONDITIONS: 
  224.         ; CARRY REFLECTS SIGN OF DIFFERENCE (SET MEANS DE < HL)
  225.         ; ZERO/NON-ZERO SET ACCORDING TO EQUALITY.
  226.         ;
  227. CCCMP:: 
  228.         MOV A,H         ;;INVERT SIGN OF HL
  229.         XRI 80H
  230.         MOV H,A
  231.         MOV A,D         ;;INVERT SIGN OF DE
  232.         XRI 80H
  233.         CMP H           ;;COMPARE MSBS
  234.         JNZ CCCMP1              ;;DONE IF NEQ
  235.         MOV A,E         ;;COMPARE LSBS
  236.         CMP L
  237. CCCMP1: LXI H,1         ;;PRESET TRUE COND
  238.         RET
  239.         ;
  240.         ;TEST IF DE >= HL (UNSIGNED)
  241.         ;
  242. CCUGE:: 
  243.         CALL CCUCMP
  244.         RNC
  245.         DCX H
  246.         RET
  247.         ;
  248.         ;TEST IF DE < HL (UNSIGNED)
  249.         ;
  250. CCULT:: 
  251.         CALL CCUCMP
  252.         RC
  253.         DCX H
  254.         RET
  255.         ;
  256.         ;TEST IF DE > HL (UNSIGNED)
  257.         ;
  258. CCUGT:: 
  259.         XCHG
  260.         CALL CCUCMP
  261.         RC
  262.         DCX H
  263.         RET
  264.         ;
  265.         ;TEST IF DE <= HL (UNSIGNED)
  266.         ;
  267. CCULE:: 
  268.         CALL CCUCMP
  269.         RZ
  270.         RC
  271.         DCX H
  272.         RET
  273.         ;
  274.         ;COMMON ROUTINE TO PERFORM UNSIGNED COMPARE
  275.         ;CARRY SET IF DE < HL
  276.         ;ZERO/NONZERO SET ACCORDINGLY
  277.         ;
  278. CCUCMP::
  279.         MOV A,D
  280.         CMP H
  281.         JNZ CCUCP1
  282.         MOV A,E
  283.         CMP L
  284. CCUCP1: LXI H,1
  285.         RET
  286.         ;
  287.         ;SHIFT DE ARITHMETICALLY RIGHT BY HL AND RETURN IN HL
  288.         ;
  289. CCASR:: 
  290.         XCHG
  291.         DCR E
  292.         RM
  293.         MOV A,H
  294.         RAL
  295.         MOV A,H
  296.         RAR
  297.         MOV H,A
  298.         MOV A,L
  299.         RAR
  300.         MOV L,A
  301.         JMP CCASR+1
  302.         ;
  303.         ;SHIFT DE ARITHMETICALLY LEFT BY HL AND RETURN IN HL
  304.         ;
  305. CCASL:: 
  306.         XCHG
  307.         DCR E
  308.         RM
  309.         DAD H
  310.         JMP CCASL+1
  311.         ;
  312.         ;SUBTRACT HL FROM DE AND RETURN IN HL
  313.         ;
  314. CCSUB:: 
  315.         MOV A,E
  316.         SUB L
  317.         MOV L,A
  318.         MOV A,D
  319.         SBB H
  320.         MOV H,A
  321.         RET
  322.         ;
  323.         ;FORM THE TWO'S COMPLEMENT OF HL
  324.         ;
  325. CCNEG:: 
  326.         CALL CCCOM
  327.         INX H
  328.         RET
  329.         ;
  330.         ;FORM THE ONE'S COMPLEMENT OF HL
  331.         ;
  332. CCCOM:: 
  333.         MOV A,H
  334.         CMA
  335.         MOV H,A
  336.         MOV A,L
  337.         CMA
  338.         MOV L,A
  339.         RET
  340.         ;
  341.         ;MULTIPLY DE BY HL AND RETURN IN HL
  342.         ;(SIGNED MULTIPLY)
  343.         ;
  344. CCMULT::
  345. MULT::    MOV B,H
  346.         MOV C,L
  347.         LXI H,0
  348. CCMLT1: MOV A,C
  349.         RRC
  350.         JNC CCMLT2
  351.         DAD D
  352. CCMLT2: XRA A
  353.         MOV A,B
  354.         RAR
  355.         MOV B,A
  356.         MOV A,C
  357.         RAR
  358.         MOV C,A
  359.         ORA B
  360.         RZ
  361.         XRA A
  362.         MOV A,E
  363.         RAL
  364.         MOV E,A
  365.         MOV A,D
  366.         RAL
  367.         MOV D,A
  368.         ORA E
  369.         RZ
  370.         JMP CCMLT1
  371.         ;
  372.         ;DIVIDE DE BY HL AND RETURN QUOTIENT IN HL, REMAINDER IN DE
  373.         ;(SIGNED DIVIDE)
  374.         ;
  375. CCDIV:: 
  376. DIV::    MOV B,H
  377.         MOV C,L
  378.         MOV A,D
  379.         XRA B
  380.         PUSH PSW
  381.         MOV A,D
  382.         ORA A
  383.         CM CCDENEG
  384.         MOV A,B
  385.         ORA A
  386.         CM CCBCNEG
  387.         MVI A,16
  388.         PUSH PSW
  389.         XCHG
  390.         LXI D,0
  391. CCDIV1: DAD H
  392.         CALL CCRDEL
  393.         JZ  CCDIV2
  394.         CALL CCCMPBCDE
  395.         JM CCDIV2
  396.         MOV A,L
  397.         ORI 1
  398.         MOV L,A
  399.         MOV A,E
  400.         SUB C
  401.         MOV E,A
  402.         MOV A,D
  403.         SBB B
  404.         MOV D,A
  405. CCDIV2: POP PSW
  406.         DCR A
  407.         JZ  CCDIV3
  408.         PUSH PSW
  409.         JMP CCDIV1
  410. CCDIV3: POP PSW
  411.         RP
  412.         CALL CCDENEG
  413.         XCHG
  414.         CALL CCDENEG
  415.         XCHG
  416.         RET
  417.         ;
  418.         ;NEGATE THE INTEGER IN DE
  419.         ;(INTERNAL ROUTINE)
  420.         ;
  421. CCDENEG:
  422.     MOV A,D
  423.         CMA
  424.         MOV D,A
  425.         MOV A,E
  426.         CMA
  427.         MOV E,A
  428.         INX D
  429.         RET
  430.         ;
  431.         ;NEGATE THE INTEGER IN BC
  432.         ;(INTERNAL ROUTINE)
  433.         ;
  434. CCBCNEG:
  435.     MOV A,B
  436.         CMA
  437.         MOV B,A
  438.         MOV A,C
  439.         CMA
  440.         MOV C,A
  441.         INX B
  442.         RET
  443.         ;
  444.         ;ROTATE DE LEFT ONE BIT
  445.         ;(INTERNAL ROUTINE)
  446.         ;
  447. CCRDEL:
  448.     MOV A,E
  449.         RAL
  450.         MOV E,A
  451.         MOV A,D
  452.         RAL
  453.         MOV D,A
  454.         ORA E
  455.         RET
  456.         ;
  457.         ;COMPARE BC TO DE
  458.         ;(INTERNAL ROUTINE)
  459.         ;
  460. CCCMPBCDE:
  461.     MOV A,E
  462.         SUB C
  463.         MOV A,D
  464.         SBB B
  465.         RET
  466.         ;
  467.         ; LOGICAL NEGATION
  468.         ;
  469. CCLNEG::
  470.         MOV A,H
  471.         ORA L
  472.         JNZ $+6
  473.         MVI L,1
  474.         RET
  475.         LXI H,0
  476.         RET
  477.         ;
  478.         ; EXECUTE "SWITCH" STATEMENT
  479.         ;
  480.         ;  HL  =  SWITCH VALUE
  481.         ; (SP) -> SWITCH TABLE
  482.         ;         DW ADDR1, VALUE1
  483.         ;         DW ADDR2, VALUE2
  484.         ;         ...
  485.         ;         DW 0
  486.         ;        [JMP default]
  487.         ;         continuation
  488.         ;
  489. CCSWITCH::      
  490.         XCHG            ;;DE =  SWITCH VALUE
  491.         POP H           ;;HL -> SWITCH TABLE
  492. SWLOOP: MOV C,M
  493.         INX H
  494.         MOV B,M         ;;BC -> CASE ADDR, ELSE 0
  495.         INX H
  496.         MOV A,B
  497.         ORA C
  498.         JZ  SWEND       ;;DEFAULT OR CONTINUATION CODE
  499.         MOV A,M
  500.         INX H
  501.         CMP E
  502.         MOV A,M
  503.         INX H
  504.         JNZ SWLOOP
  505.         CMP D
  506.         JNZ SWLOOP
  507.         MOV H,B         ;;CASE MATCHED
  508.         MOV L,C
  509. SWEND:  PCHL
  510. ;
  511. ;(code added from DDJ)
  512. ;
  513. _end:        LHLD 6                ;get bdos address
  514.             SPHL                    ;use for base of stack
  515.             LXI H, _end            ;get start of free memory
  516.             SHLD _memptr##        ;use for memory allocation
  517.             JMP _main##            ;parse command line, execut program
  518.     
  519.  
  520.     END     _end
  521.  
  522.       ;  HL  =  SWITCH VALUE
  523.         ; (SP