home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 309_01 / c.rtl < prev    next >
Text File  |  1990-03-20  |  2KB  |  116 lines

  1. ; c runtime library for division, multiply and switch
  2.  
  3.         .area    ROMCODE (REL,CON)
  4.         .globl   ccdiv
  5.         .globl   ccmult
  6.         .globl   ccswitch
  7.  
  8.         .module  crtl
  9.  
  10. ccdiv:
  11.  clr adr31
  12.  stx adr1
  13.  std adr2
  14. ccd1:
  15.  bgt ccd2
  16.  com adr31
  17.  coma
  18.  comb
  19.  addd #1
  20.  std adr2
  21. ccd2:
  22.  ldd adr1
  23.  cmpd #0
  24.  bgt ccd3
  25.  com adr31
  26.  coma
  27.  comb
  28.  addd #1
  29.  std adr1
  30. ccd3:
  31.  lda #16
  32.  sta adr3
  33.  clra
  34.  clrb
  35. divd:
  36.  asl adr1+1
  37.  rol adr1
  38.  rolb
  39.  rola
  40.  cmpd adr2
  41.  blo nosub
  42.  subd adr2
  43.  inc adr1+1
  44. nosub:
  45.  dec adr3
  46.  bne divd
  47.  tfr d,x
  48.  ldd adr1
  49.  tst adr31
  50.  beq ccd4
  51.  coma
  52.  comb
  53.  addd #1
  54. ccd4:
  55.  rts
  56.  
  57.  
  58. ; 16 bit multiplication
  59. ccmult:
  60.  stx adr1
  61.  std adr2
  62.  clr adr3
  63.  clr adr3+1
  64.  lda adr1+1
  65.  ldb adr2+1
  66.  mul
  67.  std adr3+2
  68.  lda adr1
  69.  ldb adr2+1
  70.  mul
  71.  addd adr3+1
  72.  std adr3+1
  73.  lda adr1+1
  74.  ldb adr2
  75.  mul
  76.  addd adr3+1
  77.  std adr3+1
  78.  bcc nocarry
  79.  inc adr3
  80. nocarry:
  81.  lda adr1
  82.  ldb adr2
  83.  mul
  84.  addd adr3
  85.  tfr d,x
  86.  ldd adr3+2
  87.  rts
  88.  
  89. ;  switch statement
  90. ; d = switch value
  91. ; s = switch table
  92. ;     fdb addr1, value1
  93. ;     fdb addr2, value2
  94. ;     ...
  95. ;     fdb 0
  96. ;     [jmp default]
  97. ;     continuation
  98. ;
  99. ccswitch:
  100.  puls x         ;get stack adr
  101. swloop:
  102.  ldy ,x++        ;get address
  103.  cmpy #0        ;if 0
  104.  beq swend     ;then it is the default
  105.  cmpd ,x++     ;else, if it is not the switch value
  106.  bne swloop    ;try next one
  107.  jmp ,y         ;else we found it
  108. swend:
  109.  jmp ,x         ;default exit
  110.  
  111.         .area  RAMDATA (REL,CON)
  112. adr1:    .ds 2
  113. adr2:    .ds 2
  114. adr3:    .ds 1
  115. adr31:    .ds 3
  116.