home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug103.arc / CALL.MAC < prev    next >
Text File  |  1979-12-31  |  9KB  |  459 lines

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