home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / UTILS / A / 28MAY87R.ARK / CXROM02.ASM < prev    next >
Assembly Source File  |  1989-09-27  |  7KB  |  427 lines

  1.  
  2.     page
  3. ;    *************************************************
  4. ;    -                        -
  5. ;    -    BIOS8502 code (for read only)        -
  6. ;    -                        -
  7. ;    *************************************************
  8. ;
  9. ;    10 May 85
  10. ;
  11. ;      COMMON EQUATES
  12. ;
  13. pointer    equ    20h
  14.  
  15. datchn    equ    11        ; use data channel #11
  16. cmdchn    equ    15        ; use comand channel #15
  17. ;
  18. ;    KERNAL EQUATES
  19. ;
  20. serial        equ    00A1Ch
  21. D2PRA        equ    0DD00h
  22. D1SDR        equ    0DC0Ch
  23. D1ICR        equ    0DC0Dh
  24. clk$bit        equ    10h
  25.  
  26.  
  27. K$set$bnk    equ    0FF68h
  28.  
  29. K$setlfs    equ    0FFBAh    ; setup a logical file
  30.                 ;I A=logical file #
  31.                 ;  X=device # (0-31)
  32.                 ;  Y=seconday command (FF if nane)
  33.  
  34. K$setnam    equ    0FFBDh    ; set up file name for OPEN
  35.                 ;I A=name length
  36.                 ;  X=low byte pointer to name
  37.                 ;  Y=high byte pointer to name
  38.  
  39. K$open        equ    0FFC0h    ; open a logical file (after SETLFS & SETNAM)
  40.                 ;O A = error # (1,2,4,5,6,240)
  41.  
  42. K$chkout    equ    0FFC9h    ; open a channel for output
  43.                 ;I X = logical file #
  44.                 ;O A = error #(0,3,5,7)
  45.  
  46. K$clrchn    equ    0FFCCh    ; clears ALL I/O channel 
  47.  
  48. K$chkin        equ    0FFC6h    ; open a channel for input
  49.                 ;I X = logical file #
  50.                 ;O A = errors #(0,3,5,6)
  51.  
  52. K$chrin        equ    0FFCFh    ; get a character from input channel
  53.                 ;O A=input character 
  54.  
  55. K$chrout    equ    0FFD2h    ; output a character to output channel
  56.                 ;I A =output char
  57.  
  58. K$clall        equ    0FFE7h    ; close all open files
  59.  
  60. K$close        equ    0FFC3h    ; close a logical file
  61.                 ;I A = logical channel # to be closed
  62.                 ;O A = error #(0,240)
  63.  
  64. K$readst    equ    0FFB7h    ; read status byte
  65.                 ;O A = status
  66.     PAGE
  67. ;
  68. ;
  69. ; **** THIS IS THE COMMAND LOOP ****
  70. ;
  71. boot$02$code:
  72.     @lda    0,#        ; turn on the kernal
  73.     @sta    force$map    ;
  74.     @jmp    (0fffch)    ; jmp to its start
  75.  
  76. boot$size    equ    $-boot$02$code
  77.  
  78. BB    equ    bios$02-$    ; BIOS BIAS
  79.  
  80. ;
  81. bios$65$code:
  82.     @lda    0,#        ;-K
  83.     @sta    vic$data    ;-K
  84.     @JSR    VICIO+BB    ;-K  go find and do requested operation
  85. CMDLP:
  86.     @sei
  87.     @lda    3eh,#        ;?K  set up Z80 memory map as required
  88.     @sta    force$map    ;-K
  89.     @jmp    enable$z80    ;-K
  90.  
  91.     PAGE
  92. ;
  93. ;
  94. ;
  95. ;
  96. ; **** IO COMMAND DISPATCH ROUTINE ****
  97. ;
  98. VICIO:
  99.     @CLD            ;-K  clear to binary mode
  100.     @LDA    vic$cmd        ;-K  get the command
  101.     @bne    read        ;-K   0=initialize
  102.                 ;     1=read
  103.     page
  104. ;
  105. ;
  106. ;
  107. initilize:            ;   initialize the 8502
  108.     @ldx    0,#        ;-K
  109.     @stx    force$map    ;-K  enable the kernal
  110.     @stx    VIC+26        ;+K  turn off VIC interrupts
  111.  
  112.     @ldx    low(irqs+BB),#
  113.     @ldy    high(irqs+BB),#
  114.     @stx    314h        ;+K  IRQ vector
  115.     @sty    315h
  116.     @stx    316h        ;+K  BRK vector
  117.     @sty    317h
  118.     @stx    318h        ;+K  NMI vector
  119.     @sty    319h
  120.     @jmp    opencm+BB    ;+K  go open channel to disk drive
  121.  
  122.     PAGE
  123. ;
  124. ; **** DISK SECTOR READ ****
  125. ;
  126. READ:
  127.     @lda    @dma        ;-K
  128.     @sta    pointer        ;-K
  129.     @lda    @dma+1        ;-K
  130.     @sta    pointer+1    ;-K
  131.  
  132. setdrv:
  133.     @lda    vic$trk        ;-K
  134.     @sta    F$rd$trk+BB    ;-K
  135.     @JSR    BINASC+BB    ;-K
  136.     @STX    dskcmd$T$h+BB    ;-K
  137.     @STA    dskcmd$T$l+BB    ;-K
  138.  
  139.     @lda    vic$sect    ;-K
  140.     @sta    F$rd$sect+BB    ;-K
  141.     @JSR    BINASC+BB    ;-K
  142.     @STX    dskcmd$S$h+BB    ;-K
  143.     @STA    dskcmd$S$l+BB    ;-K
  144.  
  145.     @lda    fast        ;-K
  146.     @bne    read$F        ;-K
  147.     @sta    force$map    ;-K A=0 if we did not branch
  148.     @ldx    datchn,#    ;+K
  149.     @jsr    K$chkin        ;+K
  150.     @bcs    disk$changed    ;+K
  151.     @jsr    K$clrchn    ;+K  clear the input channel for now
  152.  
  153.     @JSR    SETUP+BB    ;+K
  154.     @JSR    CKINDT+BB    ;+K
  155.  
  156.     @ldy    0,#        ;+K
  157. READ1:
  158.     @JSR    K$chrin        ;+K  get a byte from the KERNAL
  159.     @STA    (pointer),y    ;-K  save it to the DMA pointer
  160.     @iny            ;+K  advance the buffer pointer
  161.     @BNE    READ1        ;+K  loop back if not past buf end
  162.     @jmp    K$clrchn    ;+K  CLEAR CHANNEL
  163.  
  164.  
  165. DISK$CHANGED:
  166.     @lda    0FFh,#        ;?K
  167.     @skip2
  168.  
  169. fst$error:
  170.     @lda    0dh,#
  171.     @sta    vic$data    ;?K
  172.     @jmp    CMDLP+BB
  173.  
  174. ;
  175. ;
  176. ;
  177. read$F:
  178.     @lda    0,#        ;-K
  179.     @sta    force$map    ;-K
  180.     @ldx    cmdchn,#    ;+K
  181.     @jsr    K$chkout    ;+K
  182.     @bcs    fst$error    ;+K
  183. ;    @ldx    0,#        ;+K
  184.     @ldy    Fcmd$lng,#    ;+K
  185. sendf:
  186.     @lda    Fcmd$buf+BB-1,y    ;+K
  187.     @jsr    K$chrout    ;+K
  188. ;    @inx
  189.     @dey
  190.     @bne    sendf
  191.  
  192.     @jsr    K$clrchn    ;+K
  193.     @bit    D1ICR        ;+K
  194.     @ldx    F$rd$count+BB    ;+K
  195. rd$sector:
  196.     @jsr    read$byte+BB    ;+K
  197.     @and    0eh,#        ;+K  mask off error bits
  198.     @bne    fst$error
  199.  
  200.     @ldy    0,#
  201. rd$buffer:
  202.     @jsr    read$byte+BB    ;+K
  203.     @sta    (pointer),y    ;+K
  204.     @iny            ;+K
  205.     @bne    rd$buffer    ;+K
  206.  
  207.     @inc    pointer+1    ;+K
  208.     @dex            ;+K
  209.     @bne    rd$sector    ;+K
  210.  
  211. clk$hi:
  212.     @lda    d2pra        ;+K
  213.     @and    0ffh-clk$bit,#    ;+K
  214.     @sta    d2pra        ;+K
  215.     @rts            ;+K
  216.  
  217. ;
  218. ;  * DEVICE MISSING, CLEAN UP ERROR *
  219. ;
  220. MISDSK:
  221.     @LDA    00fh,#        ;+K  SET ERROR CODE
  222.     @STA    vic$data    ;+K  writes to RAM under ROM
  223.     @JMP    CMDLP+BB    ;+K
  224.  
  225.     PAGE
  226. ;
  227. ; **** OPEN DISK COMMAND CHANNEL ****
  228. ;
  229. opencm:
  230.     @LDA    cmdchn,#    ;+K
  231.     @CLC            ;+K
  232.     @JSR    K$close        ;+K
  233.     @LDA    cmdchn,#    ;+K
  234.     @sta    fast        ;+K set fast flag 
  235.     @LDX    8,#        ;+K
  236.     @TAY            ;+K
  237.     @JSR    K$setlfs    ;+K
  238.  
  239.     @LDA    0,#        ;+K
  240.     @sta    serial        ;+K clear fast serial indicator 
  241.     @TAX            ;+K
  242.     @JSR    K$set$bnk    ;+K
  243.  
  244.     @LDA    4,#            ;+K
  245.     @LDX    low(U0POINT+BB),#    ;+K
  246.     @LDY    high(U0POINT+BB),#    ;+K
  247.     @JSR    K$setnam        ;+K
  248.     @JSR    K$open            ;+K
  249.     @bcs    misdsk
  250.  
  251.     @jsr    K$readst
  252.     @ROL    A        ;+K  GET MSB TO CARRY
  253.     @BCS    MISDSK        ;+K  DEVICE MISSING IF CARRY SET
  254.     @bit    serial        ;+K  test for fast device
  255.     @bvs    no$dt$open    ;+K  do not open data channel if fast
  256.  
  257.     page
  258. ;
  259. ; **** OPEN DISK DATA CHANNEL ****
  260. ;
  261. OPENDT:
  262.     @LDA    datchn,#    ;+K
  263.     @CLC            ;+K
  264.     @JSR    K$close        ;+K
  265.     @LDA    datchn,#    ;+K
  266.     @LDX    8,#        ;+K
  267.     @LDY    8,#        ;+K
  268.     @JSR    K$setlfs    ;+K
  269.  
  270.     @LDA    0,#        ;+K
  271.     @sta    fast        ;+K  clear fast flag
  272.     @TAX            ;+K
  273.     @JSR    K$set$bnk    ;+K
  274.  
  275.     @LDA    1,#            ;+K
  276.     @LDX    low(POUND+BB),#        ;+K
  277.     @LDY    high(POUND+BB),#    ;+K
  278.     @JSR    K$setnam        ;+K
  279.     @JSR    K$open            ;+K
  280.     @bcs    misdsk
  281. no$dt$open:
  282.     @rts
  283.  
  284.     PAGE
  285. ;
  286. ;
  287. SETUP:
  288.     @JSR    CKOTCM+BB    ;+K
  289.     @LDY    dskcmd$lng,#    ;+K
  290. SETUP2:
  291.     @LDA    DSKCMD+BB-1,y    ;+K
  292.     @JSR    K$chrout    ;+K
  293.     @DEY            ;+K
  294.     @BNE    SETUP2        ;+K
  295.  
  296.     @JSR    K$clrchn    ;+K
  297.     @JSR    CKINCM+BB    ;+K
  298.     @BEQ    SETUP3        ;+K
  299.  
  300. SETUP5:
  301.     @LDA    0dh,#        ;+K  get error flag
  302.     @STA    vic$data    ;+K  writes to RAM under ROM    
  303. setup3:
  304.     @JMP    K$clrchn    ;+K
  305.  
  306.  
  307.     page
  308. ;
  309. ;
  310. ;
  311. read$byte:
  312.     @sei
  313.     @lda    d2pra
  314.     @eor    clk$bit,#
  315.     @sta    d2pra
  316.     @lda    8,#
  317. in$1:
  318.     @bit    d1icr
  319.     @beq    in$1
  320.     @lda    d1sdr
  321.     @rts
  322.  
  323.  
  324.     page
  325. ;
  326. ;    handle all interrupts in BIOS 8502 (throw them away)
  327. ;
  328. irqs:
  329.     @lda    CIA$1+int$ctrl
  330.     @lda    CIA$2+int$ctrl
  331.     @lda    0fh,#
  332.     @sta    VIC+25
  333.  
  334. ;
  335. ;    system saved memory config, Y, X and A before getting here
  336. ;
  337.     @pla
  338.     @sta    force$map
  339.     @pla
  340.     @tay
  341.     @pla
  342.     @tax
  343.     @pla
  344.     @rti
  345.  
  346. ;
  347. ;
  348.     PAGE
  349. ;
  350. ; **** CONVERT BINARY TO ASCII ****
  351. ;
  352. BINASC:
  353.     @CLD            ;-K
  354.     @LDX    '0',#        ;-K
  355.     @SEC            ;-K
  356. BA0:
  357.     @SBC    10,#        ;-K
  358.     @BCC    BA1        ;-K
  359.     @INX            ;-K
  360.     @BCS    BA0        ;-K
  361. BA1:
  362.     @ADC    3Ah,#        ;-K
  363.     @RTS            ;-K
  364.  
  365.     PAGE
  366. ;
  367. ; **** SELF CORRECTING CHECK IO ROUTINES ****
  368. ;
  369. CKICM:
  370.     @JSR    OPENCM+BB    ;+K
  371. CKINCM:
  372.     @LDX    cmdchn,#    ;+K
  373.     @JSR    K$chkin        ;+K
  374.     @BCS    CKICM        ;+K
  375.  
  376.     @JSR    K$chrin        ;+K
  377.     @CMP    '0',#        ;+K
  378.     @RTS            ;+K
  379. ;
  380. ;
  381. ;
  382. CKIDT:
  383.     @JSR    OPENDT+BB    ;+K
  384. CKINDT:
  385.     @LDX    datchn,#    ;+K
  386.     @JSR    K$chkin        ;+K
  387.     @BCS    CKIDT        ;+K
  388.     @RTS            ;+K
  389.  
  390. ;
  391. ;
  392. ;
  393. CKOCM:
  394.     @jsr    OPENCM+BB    ;+K
  395. CKOTCM:
  396.     @LDX    cmdchn,#    ;+K
  397.     @JSR    K$chkout    ;+K
  398.     @BCS    CKOCM        ;+K
  399.  
  400.     @RTS            ;+K
  401.  
  402.     PAGE
  403.  
  404.  
  405. dskcmd:        db    CR        ;
  406. dskcmd$S$l:    db    's'        ;
  407. dskcmd$S$h:    db    's '        ;
  408. dskcmd$T$l:    db    't'        ;
  409. dskcmd$T$h:    db    't 0 8:1'
  410.  
  411. U0POINT:    db    'U'    ;
  412. dskcmd$lng    equ    $-DSKCMD
  413.         db    '0',4Ch,0    ; reset disk change status (open)
  414.  
  415. POUND:        db    '#'
  416.  
  417. F$cmd$buf:
  418. F$rd$count:    db    1        ; 5 1st read always one sector
  419. F$rd$sect:    db    0        ; 4 filled in
  420. F$rd$trk:    db    0        ; 3 filled in
  421. F$cmd:        db    0        ; 2 read=0
  422.         db    '0U'        ; 1
  423. Fcmd$lng    equ    $-F$cmd$buf
  424.  
  425. bios$size    equ    $-bios$65$code
  426.  
  427.