.segment "INIT" ; start - system reset ; will goto rom at $8000... ; if locs $8004-$8008 ; = 'cbm80' ; ^^^ > these have msb set ; kernal expects... ; $8000- .word initilize (hard start) ; $8002- .word panic (warm start) ; ... else basic system used ; ******************testing only*************** ; use auto disk/cassette load when developed... ; start ldx #$ff sei txs cld jsr a0int ;test for $a0 rom in bne start1 jmp ($8000) ; go init as $a000 rom wants start1 stx vicreg+22 ;set up refresh (.x=<5) jsr ioinit ;go initilize i/o devices jsr ramtas ;go ram test and set jsr restor ;go set up os vectors ; jsr pcint ;go initilize screen newxxx cli ;interrupts okay now jmp ($a000) ;go to basic system ; a0int - test for an $8000 rom ; returns z - $8000 in ; a0int ldx #tbla0e-tbla0r ;check for $8000 a0in1 lda tbla0r-1,x cmp $8004-1,x bne a0in2 dex bne a0in1 a0in2 rts ; tbla0r .byt $c3,$c2,$cd,"80" ;..cbm80.. tbla0e ; restor - set kernal indirects and vectors (system) ; restor ldx #vectss clc ; ; vector - set kernal indirect and vectors (user) ; vector stx tmp2 sty tmp2+1 ldy #vectse-vectss-1 movos1 lda cinv,y ;get from storage bcs movos2 ;c...want storage to user lda (tmp2),y ;...want user to storage movos2 sta (tmp2),y ;put in user sta cinv,y ;put in storage dey bpl movos1 rts ; vectss .word key,timb,nnmi .word nopen,nclose,nchkin .word nckout,nclrch,nbasin .word nbsout,nstop,ngetin .word nclall,timb ;goto break on a usrcmd jmp .word nload,nsave vectse ; ramtas - memory size check and set ; ramtas lda #0 ;zero low memory tay ;start at 0002 ramtz0 sta $0002,y ;zero page sta $0200,y ;user buffers and vars sta $0300,y ;system space and user space iny bne ramtz0 ; ;allocate tape buffers ; ldx #tbuffr stx tape1 sty tape1+1 ; ; set top of memory ; ramtbt tay ;move $00 to .y lda #3 ;set high inital index sta tmp0+1 ; ramtz1 inc tmp0+1 ;move index thru memory ramtz2 lda (tmp0),y ;get present data tax ;save in .x lda #$55 ;do a $55,$aa test sta (tmp0),y cmp (tmp0),y bne size rol a sta (tmp0),y cmp (tmp0),y bne size txa ;restore old data sta (tmp0),y iny bne ramtz2 beq ramtz1 ; size tya ;set top of memory tax ldy tmp0+1 clc jsr settop lda #$08 ;set bottom of memory sta memstr+1 ;always at $0800 lda #$04 ;screen always at $400 sta hibase ;set base of screen rts bsit .word wrtz,wrtn,key,read ;table of indirects for cassette irq's ; ioinit - initilize io devices ; ioinit lda #$7f ;kill interrupts sta d1icr sta d2icr sta d1pra ;turn on stop key lda #%00001000 ;shut off timers sta d1cra sta d2cra sta d1crb sta d2crb ; configure ports ldx #$00 ;set up keyboard inputs stx d1ddrb ;keyboard inputs stx d2ddrb ;user port (no rs-232) stx sidreg+24 ;turn off sid dex stx d1ddra ;keyboard outputs lda #%00000111 ;set serial/va14/15 (clkhi) sta d2pra lda #%00111111 ;set serial in/out, va14/15out sta d2ddra ; ; set up the 6510 lines ; lda #%00111111 ;motor on, hiram lowram charen high sta r6510 lda #%00111111 ;mtr out,sw in,wr out,control out sta d6510 ; ;jsr clkhi ;clkhi to release serial devices ^ ; iokeys lda palnts ;pal or ntsc beq i0010 ;ntsc lda #sixtyp jmp i0020 i0010 lda #sixty i0020 sta d1t1h jmp piokey ; lda #$81 ;enable t1 irq's ; sta d1icr ; lda d1cra ; and #$80 ;save only tod bit ; ora #%00010001 ;enable timer1 ; sta d1cra ; jmp clklo ;release the clock line ; ; sixty hertz value ; sixty = 17045 ; ntsc sixtyp = 16421 ; pal setnam sta fnlen stx fnadr sty fnadr+1 rts setlfs sta la stx fa sty sa rts readss lda fa ;see which devices' to read cmp #2 ;is it rs-232? bne readst ;no...read serial/cass lda rsstat ;yes...get rs-232 up pha lda #00 ;clear rs232 status when read sta rsstat pla rts setmsg sta msgflg readst lda status udst ora status sta status rts settmo sta timout rts memtop bcc settop ; ;carry set--read top of memory ; gettop ldx memsiz ldy memsiz+1 ; ;carry clear--set top of memory ; settop stx memsiz sty memsiz+1 rts ;manage bottom of memory ; membot bcc setbot ; ;carry set--read bottom of memory ; ldx memstr ldy memstr+1 ; ;carry clear--set bottom of memory ; setbot stx memstr sty memstr+1 rts ; rsr 8/5/80 change io structure ; rsr 8/15/80 add memory test ; rsr 8/21/80 change i/o for mod ; rsr 8/25/80 change i/o for mod2 ; rsr 8/29/80 change ramtest for hardware mistake ; rsr 9/22/80 change so ram hang rs232 status read ; rsr 5/12/82 change start1 order to remove disk problem