home *** CD-ROM | disk | FTP | other *** search
-
- page
- ; *************************************************
- ; - -
- ; - BIOS8502 code (for read only) -
- ; - -
- ; *************************************************
- ;
- ; 10 May 85
- ;
- ; COMMON EQUATES
- ;
- pointer equ 20h
-
- datchn equ 11 ; use data channel #11
- cmdchn equ 15 ; use comand channel #15
- ;
- ; KERNAL EQUATES
- ;
- serial equ 00A1Ch
- D2PRA equ 0DD00h
- D1SDR equ 0DC0Ch
- D1ICR equ 0DC0Dh
- clk$bit equ 10h
-
-
- K$set$bnk equ 0FF68h
-
- K$setlfs equ 0FFBAh ; setup a logical file
- ;I A=logical file #
- ; X=device # (0-31)
- ; Y=seconday command (FF if nane)
-
- K$setnam equ 0FFBDh ; set up file name for OPEN
- ;I A=name length
- ; X=low byte pointer to name
- ; Y=high byte pointer to name
-
- K$open equ 0FFC0h ; open a logical file (after SETLFS & SETNAM)
- ;O A = error # (1,2,4,5,6,240)
-
- K$chkout equ 0FFC9h ; open a channel for output
- ;I X = logical file #
- ;O A = error #(0,3,5,7)
-
- K$clrchn equ 0FFCCh ; clears ALL I/O channel
-
- K$chkin equ 0FFC6h ; open a channel for input
- ;I X = logical file #
- ;O A = errors #(0,3,5,6)
-
- K$chrin equ 0FFCFh ; get a character from input channel
- ;O A=input character
-
- K$chrout equ 0FFD2h ; output a character to output channel
- ;I A =output char
-
- K$clall equ 0FFE7h ; close all open files
-
- K$close equ 0FFC3h ; close a logical file
- ;I A = logical channel # to be closed
- ;O A = error #(0,240)
-
- K$readst equ 0FFB7h ; read status byte
- ;O A = status
- PAGE
- ;
- ;
- ; **** THIS IS THE COMMAND LOOP ****
- ;
- boot$02$code:
- @lda 0,# ; turn on the kernal
- @sta force$map ;
- @jmp (0fffch) ; jmp to its start
-
- boot$size equ $-boot$02$code
-
- BB equ bios$02-$ ; BIOS BIAS
-
- ;
- bios$65$code:
- @lda 0,# ;-K
- @sta vic$data ;-K
- @JSR VICIO+BB ;-K go find and do requested operation
- CMDLP:
- @sei
- @lda 3eh,# ;?K set up Z80 memory map as required
- @sta force$map ;-K
- @jmp enable$z80 ;-K
-
- PAGE
- ;
- ;
- ;
- ;
- ; **** IO COMMAND DISPATCH ROUTINE ****
- ;
- VICIO:
- @CLD ;-K clear to binary mode
- @LDA vic$cmd ;-K get the command
- @bne read ;-K 0=initialize
- ; 1=read
- page
- ;
- ;
- ;
- initilize: ; initialize the 8502
- @ldx 0,# ;-K
- @stx force$map ;-K enable the kernal
- @stx VIC+26 ;+K turn off VIC interrupts
-
- @ldx low(irqs+BB),#
- @ldy high(irqs+BB),#
- @stx 314h ;+K IRQ vector
- @sty 315h
- @stx 316h ;+K BRK vector
- @sty 317h
- @stx 318h ;+K NMI vector
- @sty 319h
- @jmp opencm+BB ;+K go open channel to disk drive
-
- PAGE
- ;
- ; **** DISK SECTOR READ ****
- ;
- READ:
- @lda @dma ;-K
- @sta pointer ;-K
- @lda @dma+1 ;-K
- @sta pointer+1 ;-K
-
- setdrv:
- @lda vic$trk ;-K
- @sta F$rd$trk+BB ;-K
- @JSR BINASC+BB ;-K
- @STX dskcmd$T$h+BB ;-K
- @STA dskcmd$T$l+BB ;-K
-
- @lda vic$sect ;-K
- @sta F$rd$sect+BB ;-K
- @JSR BINASC+BB ;-K
- @STX dskcmd$S$h+BB ;-K
- @STA dskcmd$S$l+BB ;-K
-
- @lda fast ;-K
- @bne read$F ;-K
- @sta force$map ;-K A=0 if we did not branch
- @ldx datchn,# ;+K
- @jsr K$chkin ;+K
- @bcs disk$changed ;+K
- @jsr K$clrchn ;+K clear the input channel for now
-
- @JSR SETUP+BB ;+K
- @JSR CKINDT+BB ;+K
-
- @ldy 0,# ;+K
- READ1:
- @JSR K$chrin ;+K get a byte from the KERNAL
- @STA (pointer),y ;-K save it to the DMA pointer
- @iny ;+K advance the buffer pointer
- @BNE READ1 ;+K loop back if not past buf end
- @jmp K$clrchn ;+K CLEAR CHANNEL
-
-
- DISK$CHANGED:
- @lda 0FFh,# ;?K
- @skip2
-
- fst$error:
- @lda 0dh,#
- @sta vic$data ;?K
- @jmp CMDLP+BB
-
- ;
- ;
- ;
- read$F:
- @lda 0,# ;-K
- @sta force$map ;-K
- @ldx cmdchn,# ;+K
- @jsr K$chkout ;+K
- @bcs fst$error ;+K
- ; @ldx 0,# ;+K
- @ldy Fcmd$lng,# ;+K
- sendf:
- @lda Fcmd$buf+BB-1,y ;+K
- @jsr K$chrout ;+K
- ; @inx
- @dey
- @bne sendf
-
- @jsr K$clrchn ;+K
- @bit D1ICR ;+K
- @ldx F$rd$count+BB ;+K
- rd$sector:
- @jsr read$byte+BB ;+K
- @and 0eh,# ;+K mask off error bits
- @bne fst$error
-
- @ldy 0,#
- rd$buffer:
- @jsr read$byte+BB ;+K
- @sta (pointer),y ;+K
- @iny ;+K
- @bne rd$buffer ;+K
-
- @inc pointer+1 ;+K
- @dex ;+K
- @bne rd$sector ;+K
-
- clk$hi:
- @lda d2pra ;+K
- @and 0ffh-clk$bit,# ;+K
- @sta d2pra ;+K
- @rts ;+K
-
- ;
- ; * DEVICE MISSING, CLEAN UP ERROR *
- ;
- MISDSK:
- @LDA 00fh,# ;+K SET ERROR CODE
- @STA vic$data ;+K writes to RAM under ROM
- @JMP CMDLP+BB ;+K
-
- PAGE
- ;
- ; **** OPEN DISK COMMAND CHANNEL ****
- ;
- opencm:
- @LDA cmdchn,# ;+K
- @CLC ;+K
- @JSR K$close ;+K
- @LDA cmdchn,# ;+K
- @sta fast ;+K set fast flag
- @LDX 8,# ;+K
- @TAY ;+K
- @JSR K$setlfs ;+K
-
- @LDA 0,# ;+K
- @sta serial ;+K clear fast serial indicator
- @TAX ;+K
- @JSR K$set$bnk ;+K
-
- @LDA 4,# ;+K
- @LDX low(U0POINT+BB),# ;+K
- @LDY high(U0POINT+BB),# ;+K
- @JSR K$setnam ;+K
- @JSR K$open ;+K
- @bcs misdsk
-
- @jsr K$readst
- @ROL A ;+K GET MSB TO CARRY
- @BCS MISDSK ;+K DEVICE MISSING IF CARRY SET
- @bit serial ;+K test for fast device
- @bvs no$dt$open ;+K do not open data channel if fast
-
- page
- ;
- ; **** OPEN DISK DATA CHANNEL ****
- ;
- OPENDT:
- @LDA datchn,# ;+K
- @CLC ;+K
- @JSR K$close ;+K
- @LDA datchn,# ;+K
- @LDX 8,# ;+K
- @LDY 8,# ;+K
- @JSR K$setlfs ;+K
-
- @LDA 0,# ;+K
- @sta fast ;+K clear fast flag
- @TAX ;+K
- @JSR K$set$bnk ;+K
-
- @LDA 1,# ;+K
- @LDX low(POUND+BB),# ;+K
- @LDY high(POUND+BB),# ;+K
- @JSR K$setnam ;+K
- @JSR K$open ;+K
- @bcs misdsk
- no$dt$open:
- @rts
-
- PAGE
- ;
- ;
- SETUP:
- @JSR CKOTCM+BB ;+K
- @LDY dskcmd$lng,# ;+K
- SETUP2:
- @LDA DSKCMD+BB-1,y ;+K
- @JSR K$chrout ;+K
- @DEY ;+K
- @BNE SETUP2 ;+K
-
- @JSR K$clrchn ;+K
- @JSR CKINCM+BB ;+K
- @BEQ SETUP3 ;+K
-
- SETUP5:
- @LDA 0dh,# ;+K get error flag
- @STA vic$data ;+K writes to RAM under ROM
- setup3:
- @JMP K$clrchn ;+K
-
-
- page
- ;
- ;
- ;
- read$byte:
- @sei
- @lda d2pra
- @eor clk$bit,#
- @sta d2pra
- @lda 8,#
- in$1:
- @bit d1icr
- @beq in$1
- @lda d1sdr
- @rts
-
-
- page
- ;
- ; handle all interrupts in BIOS 8502 (throw them away)
- ;
- irqs:
- @lda CIA$1+int$ctrl
- @lda CIA$2+int$ctrl
- @lda 0fh,#
- @sta VIC+25
-
- ;
- ; system saved memory config, Y, X and A before getting here
- ;
- @pla
- @sta force$map
- @pla
- @tay
- @pla
- @tax
- @pla
- @rti
-
- ;
- ;
- PAGE
- ;
- ; **** CONVERT BINARY TO ASCII ****
- ;
- BINASC:
- @CLD ;-K
- @LDX '0',# ;-K
- @SEC ;-K
- BA0:
- @SBC 10,# ;-K
- @BCC BA1 ;-K
- @INX ;-K
- @BCS BA0 ;-K
- BA1:
- @ADC 3Ah,# ;-K
- @RTS ;-K
-
- PAGE
- ;
- ; **** SELF CORRECTING CHECK IO ROUTINES ****
- ;
- CKICM:
- @JSR OPENCM+BB ;+K
- CKINCM:
- @LDX cmdchn,# ;+K
- @JSR K$chkin ;+K
- @BCS CKICM ;+K
-
- @JSR K$chrin ;+K
- @CMP '0',# ;+K
- @RTS ;+K
- ;
- ;
- ;
- CKIDT:
- @JSR OPENDT+BB ;+K
- CKINDT:
- @LDX datchn,# ;+K
- @JSR K$chkin ;+K
- @BCS CKIDT ;+K
- @RTS ;+K
-
- ;
- ;
- ;
- CKOCM:
- @jsr OPENCM+BB ;+K
- CKOTCM:
- @LDX cmdchn,# ;+K
- @JSR K$chkout ;+K
- @BCS CKOCM ;+K
-
- @RTS ;+K
-
- PAGE
-
-
- dskcmd: db CR ;
- dskcmd$S$l: db 's' ;
- dskcmd$S$h: db 's ' ;
- dskcmd$T$l: db 't' ;
- dskcmd$T$h: db 't 0 8:1'
-
- U0POINT: db 'U' ;
- dskcmd$lng equ $-DSKCMD
- db '0',4Ch,0 ; reset disk change status (open)
-
- POUND: db '#'
-
- F$cmd$buf:
- F$rd$count: db 1 ; 5 1st read always one sector
- F$rd$sect: db 0 ; 4 filled in
- F$rd$trk: db 0 ; 3 filled in
- F$cmd: db 0 ; 2 read=0
- db '0U' ; 1
- Fcmd$lng equ $-F$cmd$buf
-
- bios$size equ $-bios$65$code
-