home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 221_01 / c.rtl < prev    next >
Text File  |  1979-12-31  |  5KB  |  358 lines

  1.  LIB CCEQU.SYS
  2.  NAME CRTL
  3. *
  4. * 16 bit division
  5. *
  6.  GLOBAL ccdiv,ccmult
  7.  GLOBAL fopen,fclose,getc,putc,putchar,getchar,rewind,gets
  8.  GLOBAL exit
  9.  GLOBAL CCSWITCH
  10. *
  11. * D=X/D
  12. *
  13. ccdiv
  14.  CLR ADR31
  15.  STX ADR1
  16.  STD ADR2
  17.  CMPD #0
  18.  BNE ccd1
  19.  LDA #103
  20.  LBRA exi1
  21. ccd1 BGT ccd2
  22.  COM ADR31
  23.  COMA
  24.  COMB
  25.  ADDD #1
  26.  STD ADR2
  27. ccd2 LDD ADR1
  28.  CMPD #0
  29.  BGT ccd3
  30.  COM ADR31
  31.  COMA
  32.  COMB
  33.  ADDD #1
  34.  STD ADR1
  35. ccd3 LDA #16
  36.  STA ADR3
  37.  CLRA
  38.  CLRB
  39. DIVD ASL ADR1+1
  40.  ROL ADR1
  41.  ROLB
  42.  ROLA
  43.  CMPD ADR2
  44.  BLO NOSUB
  45.  SUBD ADR2
  46.  INC ADR1+1
  47. NOSUB DEC ADR3
  48.  BNE DIVD
  49.  TFR D,X
  50.  LDD ADR1
  51.  TST ADR31
  52.  BEQ ccd4
  53.  COMA
  54.  COMB
  55.  ADDD #1
  56. ccd4 RTS
  57. *
  58. * 16 bit multiplication
  59. *
  60. ccmult
  61.  STX ADR1
  62.  STD ADR2
  63.  CLR ADR3
  64.  CLR ADR3+1
  65.  LDA ADR1+1
  66.  LDB ADR2+1
  67.  MUL
  68.  STD ADR3+2
  69.  LDA ADR1
  70.  LDB ADR2+1
  71.  MUL
  72.  ADDD ADR3+1
  73.  STD ADR3+1
  74.  LDA ADR1+1
  75.  LDB ADR2
  76.  MUL
  77.  ADDD ADR3+1
  78.  STD ADR3+1
  79.  BCC NOCARRY
  80.  INC ADR3
  81. NOCARRY LDA ADR1
  82.  LDB ADR2
  83.  MUL
  84.  ADDD ADR3
  85.  TFR D,X
  86.  LDD ADR3+2
  87.  RTS
  88. ADR1 RMB 2
  89. ADR2 RMB 2
  90. ADR3 RMB 1
  91. ADR31 RMB 3
  92. *
  93. * file open routine
  94. *
  95. fopen
  96. *
  97. * I/O routines
  98. *
  99. * select FCB
  100. *
  101.  LDA #NOFILE get number of allowed files
  102.  LDB FCBPTR get file id pointer
  103. fop1 RORB search for free slot
  104.  BCC fop3 found
  105.  DECA try next
  106.  LBEQ foperr no free found
  107.  BRA fop1 else try again
  108. fop3 LDX #FCB-FCBSIZ found, get FCB adr
  109.  DECA
  110.  CLRB
  111.  ORCC #1 set carry flag
  112. fop2 LEAX FCBSIZ,X get next FCB
  113.  INCA
  114.  ROLB
  115.  CMPA #NOFILE found?
  116.  BNE fop2 no, try next one
  117.  STB ADR1 save flag
  118.  LDY 4,S get adr of filename
  119.  STY LBPTR store in line buffer ptr
  120.  CLRA replace \0 with CR
  121. FENDSTR CMPA ,Y+
  122.  BNE FENDSTR
  123.  LDA #13
  124.  STA ,-Y
  125.  JSR GETFIL check file name and set in FCB
  126.  BCS foperr
  127. fdefex LDA #1 set default extension to .TXT
  128.  JSR SETEXT
  129. fopen9 LDY 2,S get mode
  130.  LDA ,Y+ get first char of mode
  131.  ORA #$20 force lower case
  132.  STY ADR2 save adr
  133.  LDY #FMODE search for right mode
  134. fopen2 CMPA ,Y+
  135.  BEQ fopen3 found
  136.  LDB ,Y+
  137.  BNE fopen2
  138.  BRA foperr
  139. fopen3 LDA ,Y
  140.  STA ,X
  141.  TFR A,B
  142.  JSR FMS open file
  143.  BEQ fopok go if ok
  144.  CMPB #2 else if it exist already (write)
  145.  BNE foperr
  146.  LDA #12 delete file
  147.  STA ,X
  148.  JSR FMS
  149.  BNE foperr on error return 0
  150. *
  151. * now recover file name
  152. *
  153.  LDY 4,S
  154.  STY LBPTR
  155.  JSR GETFIL
  156.  LDA #2 and try again
  157.  STA ,X
  158.  JSR FMS
  159.  BNE foperr branch on error
  160. fopok LDB ADR2 get next char
  161.  CMPB #'b binary file access?
  162.  BNE FRTS yes
  163.  LDA #$FF indicate binary
  164.  STA 59,X
  165. FRTS LDA ADR1 recall flag
  166.  ORA FCBPTR set fcb in use
  167.  STA FCBPTR
  168.  TFR X,D give FCB address to program
  169.  RTS else return
  170. foperr LDD #0
  171.  RTS
  172. NOFILE EQU 4 number of files allowed
  173. FMODE EQU * file access mode
  174.  FCB 'r
  175. FREAD FCB 1
  176.  FCB 'w
  177. FWRITE FCB 2
  178.  FCB 'u
  179. FUPDATE FCB 3
  180.  FCB 'b
  181. FBIN FCB 4
  182.  FDB 0
  183. FCBPTR FCB 0 pointer to FCB
  184. FCBSIZ EQU 320 size of FCB
  185. FCB RMB FCBSIZ*NOFILE
  186. *
  187. * check if valid FCB
  188. * X=FCB , returns -1 in D if false
  189. *
  190. CHKFCB CMPX #FCB
  191.  BEQ CHKRET
  192.  CMPX #FCB+FCBSIZ
  193.  BEQ CHKRET
  194.  CMPX #FCB+FCBSIZ+FCBSIZ
  195.  BEQ CHKRET
  196.  CMPX #FCB+FCBSIZ+FCBSIZ+FCBSIZ
  197.  BEQ CHKRET
  198.  LDD #-1
  199. CHKRET RTS
  200. *
  201. * read character from file
  202. *
  203. getc
  204.  LDX 2,S get FCB adr
  205.  CMPX #3
  206.  LBLO getchar yes, standart device
  207.  BSR CHKFCB check if FCB is ok
  208.  LBMI foperr something was wrong
  209.  CLR ,X in FCB
  210.  JSR FMS
  211.  BNE getc1
  212.  TFR A,B
  213.  SEX
  214.  RTS
  215. getc1 LDA 1,X get error code
  216.  CMPA #8 end of file ?
  217.  LBNE foperr no, error
  218.  LDD #-1 else return EOF
  219.  RTS
  220. * put character to file
  221. *
  222. putc
  223.  LDX 2,S get FCB adr
  224.  CMPX #2
  225.  BHI putc1
  226.  LDA 5,S
  227.  BRA putcha1
  228. putc1 BSR CHKFCB
  229.  LBMI foperr
  230.  CLR ,X
  231.  LDA 5,S
  232.  JSR FMS
  233.  LBNE foperr
  234.  LDD #1
  235.  RTS
  236. *
  237. * close file
  238. *
  239. fclose
  240.  LDX 2,S
  241.  BSR CHKFCB
  242.  LBMI foperr
  243.  LDA #4
  244.  STA ,X
  245.  JSR FMS
  246.  LBNE foperr
  247. *
  248. * reset FCB pointer
  249. *
  250.  LDB #1
  251.  PSHS B
  252.  TFR X,D
  253.  SUBD #FCB
  254.  BEQ RESPTR
  255. L1 STD ADR1
  256.  PULS B
  257.  LSLB
  258.  PSHS B
  259.  LDD ADR1
  260.  SUBD #FCBSIZ
  261.  BEQ RESPTR
  262.  BRA L1
  263. RESPTR PULS B
  264.  EORB FCBPTR
  265.  STB FCBPTR
  266.  RTS
  267. *
  268. * rewind file
  269. *
  270. rewind
  271.  LDX 2,S
  272.  LBSR CHKFCB
  273.  LBMI foperr
  274.  LDA #5
  275.  STA ,X
  276.  JSR FMS
  277.  LBNE foperr
  278.  RTS
  279. *
  280. * exit program, calls FLEX warm start entry
  281. * and reports error
  282. *
  283. exit
  284.  LDD 2,S
  285. exi1 LDX #FCB
  286.  STA 1,X
  287.  JSR REPERR
  288.  JMP WARMS
  289.  RTS
  290. *
  291. * report error
  292. *
  293. reperr
  294.  LDX 2,S get FCB adr
  295.  JMP REPERR
  296. *
  297. * get character from keyboard
  298. *
  299. getchar
  300.  JSR GETCHR
  301.  TFR A,B
  302.  SEX
  303.  RTS
  304. *
  305. * write character to terminal
  306. *
  307. putchar
  308.  LDA 3,S get character
  309. putcha1 JSR PUTCHR
  310.  CMPA #13
  311.  BNE P1
  312.  LDA #10
  313.  JMP PUTCHR
  314. P1 RTS
  315. *
  316. * get line from keyboard
  317. *
  318. gets
  319.  LDX 2,S get adr of line
  320. gets1 BSR getchar get character in B
  321.  CMPB #8 delete ?
  322.  BNE gets2
  323.  LDA #$20
  324.  JSR PUTCHR
  325.  LDA #8
  326.  JSR PUTCHR
  327.  LDA ,-X
  328.  BRA gets1
  329. gets2 STB ,X+
  330.  CMPB #13 end of input?
  331.  BNE gets1 no
  332.  CLRA
  333.  STA ,-X
  334.  RTS
  335. *
  336. *  switch statement
  337. *
  338. * D = switch value
  339. * S = switch table
  340. *     FDB addr1, value1
  341. *     FDB addr2, value2
  342. *     ...
  343. *     FDB 0
  344. *     [JMP DEFAULT]
  345. *     continuation
  346. *
  347. CCSWITCH
  348.  PULS X get stack adr
  349. SWLOOP LDY ,X++ get address
  350.  CMPY #0 if 0
  351.  BEQ SWEND then it is the default
  352.  CMPD ,X++ else, if it is not the switch value
  353.  BNE SWLOOP try next one
  354.  JMP ,Y else we found it
  355. SWEND JMP ,X default exit
  356.  END
  357.