?login_element?

Subversion Repositories NedoOS

Rev

Rev 922 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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
  54. NEDOOSMEMTOP=0xff00;bdosp:      equ ram+6
  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
  67. ;coninp:                equ 1
  68. ;conout:                equ 2
  69. ;readbuf:       equ 10
  70. ;intcon:                equ 11
  71. ;select:                equ 14
  72. openfil:        equ 15
  73. closefil:       equ 16
  74. delete:         equ 19
  75. rsequen:        equ 20
  76. wsequen:        equ 21
  77. makfil:         equ 22
  78. ;gdisk:         equ 25
  79. sdma:           equ 26
  80. ;sguser:                equ 32
  81.         ENDIF
  82.  
  83.         org PROGSTART;ram+100h  ;start of TPA
  84. begin  
  85.         ;IF SLRMAC
  86.         include cc2a.asm
  87.         include cc2b.asm
  88.         include cc2c.asm
  89.         include cc2d.asm
  90.         include cc2e.asm
  91.         include "../_sdk/stdio.asm"
  92.         ;ENDIF
  93.  
  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.  
  487.         ;IF LASM
  488.         ;end
  489.         ;ENDIF
  490.  
  491. end
  492.         savebin "cc2.com",begin,end-begin
  493.        
  494.         LABELSLIST "../../us/user.l"
  495.