Subversion Repositories NedoOS

Rev

Rev 922 | Details | Compare with Previous | Last modification | View Log

Rev Author Line No. Line
630 alone 1
        DEVICE ZXSPECTRUM128
2
        include "../_sdk/sys_h.asm"
3
        include "8080.asm"
4
 
5
;
6
; Main source driver for CC2.ASM:
7
;
8
 
9
        ;page 76
10
        ;title 'CC2.ASM v1.6  3/86'
11
 
12
true:   equ 0ffffh
13
false:  equ not true
14
 
15
ZSYSTEM equ true
16
SLRMAC: equ true;false
17
LASM:   equ not SLRMAC
18
 
19
trs80:  equ false       ;true if TRS-80 (org 4200h) version
20
 
21
ALPHA:  equ false       ;true for Alpha-C version
22
MARC:   equ false       ;true if MARC version
23
CPM:    equ not MARC    ;true if CPM version
24
 
25
        if not ZSYSTEM
26
version: equ '6'        ;the 'x' in 'v1.x'
27
updatn: equ 0           ;the `y' in `v1.xy'      (number)
28
updaty: equ 0           ;the `z' in `v1.xyz', or zero if none (character)
29
        endif
30
 
31
        if ZSYSTEM
32
version: equ '2'        ;the 'x' in 'vZx.yz'
33
updatn: equ 0           ;the `y' in `vZx.yz'     (number)
34
updaty: equ 0           ;the `z' in `vZx.yz', or zero if none (character)
35
        endif
36
 
37
debug:  equ false
38
I80:    equ true
39
I86:    equ false
40
 
41
 
42
        IF LASM
43
        ;sym
44
        ENDIF
45
 
46
 
47
ram:    equ 0           ;start of ram area (either 0 or 4200h) for compiler
48
 
49
cr:     equ 0dh
50
lf:     equ 0ah
51
 
52
        IF CPM
53
bdos:   equ ram+5
632 alone 54
NEDOOSMEMTOP=0xff00;bdosp:      equ ram+6
630 alone 55
fcb:    equ ram+5ch
56
nr:     equ fcb+32
57
        ENDIF
58
 
59
tbuff:  equ ram+80h
60
extbas: equ 0015h       ;external base pointer in C.CCC
61
 
62
fnlen:  equ 12
63
nestmax: equ 5
64
 
65
 
66
        IF CPM
632 alone 67
;coninp:                equ 1
68
;conout:                equ 2
69
;readbuf:       equ 10
70
;intcon:                equ 11
71
;select:                equ 14
630 alone 72
openfil:        equ 15
73
closefil:       equ 16
74
delete:         equ 19
75
rsequen:        equ 20
76
wsequen:        equ 21
77
makfil:         equ 22
632 alone 78
;gdisk:         equ 25
630 alone 79
sdma:           equ 26
632 alone 80
;sguser:                equ 32
630 alone 81
        ENDIF
82
 
83
        org PROGSTART;ram+100h  ;start of TPA
84
begin  
85
        ;IF SLRMAC
930 alone 86
        include cc2a.asm
87
        include cc2b.asm
88
        include cc2c.asm
89
        include cc2d.asm
90
        include cc2e.asm
683 alone 91
        include "../_sdk/stdio.asm"
630 alone 92
        ;ENDIF
93
 
683 alone 94
;
95
; Initialization code, placed over table storge not used until
96
; after completion of initialization
97
;
98
 
99
c2init:
100
 
101
        IF CPM
102
        ld de,tbuff
103
        ld c,sdma
104
        call bdos       ;set default DMA buffer
105
        ENDIF
106
 
107
        lda erasub      ;bit 1 of erasub is werrs flag
108
        ld b,a
109
        and 2
110
        sta werrs       ;set werrs
111
        ld a,b
112
        and 1
113
        sta erasub     
114
 
115
 
116
        ld a,1
117
        sta prerrs      ;print out errors
118
        sta entn
119
        sta codflg      ;enable code generation
120
        dec a
121
        sta errf        ;no errors yet
122
        sta prnflg      ;not inside parentheses
123
        sta modstc      ;clear module nesting count
124
        sta errsin
125
 
126
        call clrdir     ;clear 512 byte directory area
127
        call opsin      ;initailize operator stacks
128
        call minit      ;adjust macro table for -z optimizations
129
 
130
        call readf      ;read in CCI file, or copy down from hi ram
131
        shld eofad      ;set EOF address
132
 
133
        ld hl,direc     ;init directory pointer
134
        shld dirp
135
 
136
        lhld st-4
137
        push hl
138
        ld b,3
139
cc21:   xor a           ;compute # of entries in symbol table
140
        ld a,h          ;by dividing size of table by 8
141
        rra
142
        push af
143
        and 7fh
144
        ld h,a
145
        pop af
146
        ld a,l
147
        rra
148
        ld l,a
149
        dec b
150
        jp nz,cc21
151
        shld stno       ;and store # of entries
152
        pop hl          ;HL is size of symbol table
153
 
154
        ld de,st        ;get base of sym tab in DE
155
        add hl,de               ;now HL is base of func name tab
156
        shld fntb
157
        ex de,hl                ;put in DE
158
        lhld st-2       ;get length of sym tab
159
        add hl,de               ;now HL is start of CCI code
160
        push hl         ;as well as base of generated code area. Save it
161
        shld start      ;on stack and at "start"
162
 
163
        dec h           ;compute code area offset, which
164
        dec h           ; when added to a pointer to an absolute
165
        call cmh        ; location in generated code during code
166
        shld cdao       ; generation, yields final addr of that code
167
                        ; in the generated CRL file.
168
        pop hl          ;get start of CCI code area
169
        push hl
170
        call mvup       ;lde CCI code up to high memory
171
        shld cdp        ;Save pointer to CCI code at "cdp".
172
        pop hl          ;get back code area pointer
173
 
174
        lda eflag       ;has -e option been used?
175
        or a
176
        jp z,cc22               ;if not, go put zeroes in the first 3 bytes of code
177
 
178
        ld (hl),0bdh    ;else stick in a famous "BD" byte to indicate
179
        inc hl          ;an explicit external address for CLINK
180
        ex de,hl
181
        lhld exaddr     ;get the explicit external address
182
        ex de,hl
183
        ld (hl),e
184
        inc hl
185
        ld (hl),d
186
        jp cc23 ;and rejoin the mainstream.
187
 
188
cc22:   xor a           ;fill first 3 bytes of 5th sector with zeros
189
        ld (hl),a               ;if explicit external starting address not given.
190
        inc hl
191
        ld (hl),a
192
        inc hl
193
        ld (hl),a
194
 
195
cc23:   inc hl
196
        ex de,hl
197
        lhld st-6       ;get external data area size
198
        ex de,hl                ;and put it here at 4th byte of 5th sector
199
        ld (hl),e
200
        inc hl
201
        ld (hl),d
202
        inc hl
203
        shld codp       ;save code area pointer
204
 
205
        ld hl,lblt      ;Initialize label table
206
        shld lblp
207
 
208
        ld hl,modstk    ;initialize module stack
209
        shld modstp
210
 
211
        call fstgs      ;find the collected text strings
212
 
213
        ld hl,ltab      ;initialize logical conditional branch label table
214
        shld ltabp      ;(first 5 bytes aren't used, but why play with fire?)
215
 
216
        ld hl,pshptb    ;initialize "push optimization" table
217
        shld pshpp
218
 
219
        ld hl,8000h     ;and "symbolic label" name (number) generator
220
        shld lbln
221
 
222
        ld hl,modstk    ;initialize module stack
223
        shld modstp
224
 
225
        ld hl,0
226
        shld nlcnt      ;initialize line count
227
        ret
228
 
229
 
230
        IF NOT ALPHA
231
s0:     db 'BD Software C Compiler'
232
        ENDIF
233
 
234
        IF ALPHA
235
s0:     db 'BDS Alpha-C Compiler'
236
        ENDIF
237
 
238
        IF NOT ZSYSTEM
239
        db ' v1.'
240
        db version
241
        db updatn + '0'
242
        ENDIF
243
 
244
        IF ZSYSTEM
245
        db ' (for ZCPR3) vZ'
246
        db version
247
        db '.'
248
        db updatn + '0'
249
        ENDIF
250
 
251
        db ' (part II)+'
252
 
253
;
254
; Clear new directory for the CRL file about to be created:
255
;
256
 
257
clrdir: ld bc,512
258
        ld hl,direc
259
clrdr2: ld (hl),0
260
        inc hl
261
        dec bc
262
        ld a,b
263
        or c
264
        jp nz,clrdr2
265
        ret
266
 
267
 
268
        if 1==0 ;killed by a bug!!!
269
;
270
; Initialize operator stack and operand
271
; information stack:
272
;
273
 
274
opsin:  push hl
275
        ld hl,opstk
276
        shld opstp
277
        ld (hl),0ffh
278
        ld hl,infstk
279
        shld infsp
280
        pop hl
281
        ret
282
        endif
283
 
284
;
285
; Read in the CCI file from disk, or lde it down from high
286
; memory if left there by CC1:
287
;
288
 
289
readf:  lda chainf              ;chained to from CC1?
290
        or a
291
 
292
        IF CPM
293
          jp z,readf0           ;if not, load cci file under CP/M
294
        ENDIF
295
 
296
        lhld curtop             ;yes. copy down to low ram
297
        ld de,-35
298
        add hl,de
299
        push hl                 ;save last addr + 1
300
        ld a,(hl)
301
        inc hl
302
        ld h,(hl)
303
        ld l,a                  ;HL = first address
304
        inc hl                  ;or rather, it does now
305
        ld b,h
306
        ld c,l                  ;BC = 1st address of text
307
        ld a,st/256             ;make sure we have enough room...
308
        cp b                    ;hi byte of symbol table area must be less 
309
        jp nc,rdf4              ;than high byte of cci code area
310
 
311
        call cmh
312
        pop de
313
        add hl,de
314
        ex de,hl                        ;DE = length
315
        ld hl,st-6              ;HL = destination
316
rloop:  ld a,(bc)
317
        ld (hl),a
318
        inc hl
319
        inc bc
320
        dec de
321
        ld a,d
322
        or e
323
        jp nz,rloop
324
        shld eofad      ;save end address
325
        ld (hl),1ah
326
        ret
327
 
328
 
329
readf0:
330
        IF CPM
331
        ld hl,fcb+9
332
        ld (hl),'C'
333
        inc hl
334
        ld (hl),'C'
335
        inc hl
336
        ld (hl),'I'
337
 
338
        call fopen
339
 
340
        ld hl,st-6
341
rdf2:   call reads
342
        jp nc,rdf2a
343
        call fclose
344
        ret
345
 
346
rdf2a:  ld de,tbuff
347
        ld b,80h
348
rdf3:   ld a,(de)
349
        ld (hl),a
350
        inc hl
351
        inc de
352
        dec b
353
        jp nz,rdf3
354
 
355
        lda curtop+1
356
        ld c,a
357
        dec c
358
        ld a,h
359
        cp c
360
        jp c,rdf2
361
        ENDIF
362
 
363
rdf4:   ld de,stgom
364
        call perrab
365
 
366
 
367
 
368
;
369
; lde the CCI code up out of the way to make room for
370
; code generation:
371
;
372
 
373
mvup:   call cmh        ;put -(base of cci code)...
374
        ex de,hl                ;  ...into DE
375
        lhld eofad      ;end of cci code
376
        push hl         ;save end of source area
377
        add hl,de               ;end of cci code - base of cci code
378
        inc hl          ;end of code - base of code + 1
379
        ld b,h          ;this is the length of the code;
380
        ld c,l          ;block length in  BC
381
 
382
        pop de          ;DE is end of source area
383
 
384
        lhld curtop     ;HL is end of memory (destination area)
385
        dec hl          ;just below BDOS
386
        dec hl          ; but one more for good measure
387
 
388
mvup2:  ld a,2          ;check to see if we're on a Z80
389
        inc a
390
        jp pe,mvup80
391
 
392
        ex de,hl                ;Z80. put source in HL and destination in DE
393
        db 0edh,0b8h    ;Z80 block lde
394
        ex de,hl                ;flip registers again
395
        jp mvup3
396
 
397
mvup80: ld a,(de)               ;get byte of source
398
        ld (hl),a               ;lde up
399
        dec hl          ;debump dest
400
        dec de          ;and source
401
        dec bc          ;and count
402
        ld a,b
403
        or c   
404
        jp nz,mvup80    ;loop till done
405
 
406
mvup3:  inc hl          ;restore HL to first character of CCI code
407
        ret             ;and return with HL pointing to start of CCI code
408
 
409
 
410
 
411
 
412
;
413
; Find the location of the string constant table in
414
; the just-read-in .CCI file:
415
;
416
 
417
fstgs:  lhld cdp
418
fstg1:  call pascd2
419
        push af
420
        cp swtcd
421
        jp nz,fstg2
422
        inc hl
423
        call igsht
424
        call mtchp
425
fstg1a: ld a,(hl)
426
        cp nlcd
427
        inc hl
428
        jp z,fstg1a
429
        ld e,(hl)
430
        ld d,0
431
        inc hl
432
        add hl,de
433
        add hl,de
434
        add hl,de
435
        add hl,de
436
        inc hl
437
fstg2:  pop af
438
        inc hl
439
        jp nz,fstg1
440
        shld stgad
441
        ret
442
 
443
 
444
;
445
; The following data storge is overlayed on pass 2 initialization code:
446
;
447
 
448
        ;org c2init
449
 
450
opstk=c2init ;: ds 40           ;operator stack for expression evaluation
451
infstk=opstk+40;:       ds 250          ;info stack for expression evaluation (where
452
                        ;info on each value is pushed and popped as
453
                        ;needed.)
454
 
455
relt=infstk+250;:       ds 1600         ;relocation table
456
 
457
        ds relt+1600-$
458
 
459
lblt:   ds 1700         ;label table
460
 
461
lbrt:   ds 1600         ;label reference table
462
 
463
;       ds 300
464
;stack: equ $
465
 
466
strsz:  equ 200
467
 
468
strtb:  ds strsz+3      ;up to (strsz/4) intelligently handled  strings
469
 
470
ltab:   ds 200          ;logical label table
471
ltabp:  ds 2            ;logical label table pointer
472
 
473
pshptb: ds 30           ;push-optimization history table
474
pshpp:  ds 2            ;push-optimization table pointer
475
 
476
direc:  ds 512          ;area where CRL directory is built up
477
endir:  equ $
478
 
479
;
480
; This is where the .CCI file gets loaded:
481
;
482
 
483
        ds 6
484
st:     equ $
485
 
486
 
630 alone 487
        ;IF LASM
683 alone 488
        ;end
630 alone 489
        ;ENDIF
490
 
491
end
492
        savebin "cc2.com",begin,end-begin
493
 
632 alone 494
        LABELSLIST "../../us/user.l"