Jump to content
IGNORED

xBIOS - tutorial


Recommended Posts

Hi,

 

first example. realtime kefrens during I/O ( online little help http://xxl.atari.pl/?p=1076 )


xBIOS                           equ $800
xBIOS_MAGIC                     equ xBIOS
xBIOS_VERSION                   equ xBIOS+$02
xBIOS_RENAME_ENTRY              equ xBIOS+$03
xBIOS_LOAD_FILE                 equ xBIOS+$06
xBIOS_OPEN_FILE                 equ xBIOS+$09
xBIOS_LOAD_DATA                 equ xBIOS+$0c
xBIOS_WRITE_DATA                equ xBIOS+$0f
xBIOS_OPEN_CURRENT_DIR          equ xBIOS+$12
xBIOS_GET_BYTE                  equ xBIOS+$15
xBIOS_PUT_BYTE                  equ xBIOS+$18
xBIOS_FLUSH_BUFFER              equ xBIOS+$1b
xBIOS_SET_LENGTH                equ xBIOS+$1e
xBIOS_SET_INIAD                 equ xBIOS+$21
xBIOS_SET_FILE_OFFSET           equ xBIOS+$24
xBIOS_SET_RUNAD                 equ xBIOS+$27
xBIOS_SET_DEFAULT_DEVICE        equ xBIOS+$2A
xBIOS_OPEN_DIR                  equ xBIOS+$2D
xBIOS_LOAD_BINARY_FILE          equ xBIOS+$30
xBIOS_OPEN_DEFAULT_DIR          equ xBIOS+$33
xBIOS_SET_DEVICE                equ xBIOS+$36
xBIOS_RELOCATE_BUFFER           equ xBIOS+$39
xBIOS_GET_ENTRY                 equ xBIOS+$3c
xBIOS_OPEN_DEFAULT_FILE         equ xBIOS+$3f
xBIOS_READ_SECTOR               equ xBIOS+$42
xBIOS_FIND_ENTRY                equ xBIOS+$45

xIRQEN                          equ xBIOS+$3ea ; User IRQ (1 byte)

		icl     'atarihw.ah'

scr             equ     $00
_t0             equ     $0300
_t1             equ     $0400
_t2             equ     $0500

		opt     h+o+l+

                org     $c00
start_sio       lda     #$00
                sta     xIRQEN                          ; user IRQ
                jmp     xBIOS_SET_DEFAULT_DEVICE        ; SIO drive
                ini     start_sio

                org     nmien
                .byte   $00
                org     irqen
                .byte   $00
                org     dmactl
                .byte   $00
                org     portb   ; ROM OFF
                .byte   $fe
                org     nmiv
                .word   NMI
                org     dlistl
                .word   mydlist
                org     colpf2
                .byte   $00

                org     _t0
sine		.byte   sin(61,61,255,0,255)

                org     $0020

NMI		bit     nmist
		bpl     VBL

  		sta     sDLIA
                
                lda     #$AA
skip    equ     *-1
                asl     @
                rol     skip
                bcc     faza2

                inc     D0
                lda     D1
                clc
                adc     #$f9
                sta     D1
                
                lda     _t0
D0      equ     *-2
                adc     _t0
D1      equ     *-2
                sta     _t1l
                sta     _t2l
                
                lda     sDLIA
                rti
              
faza2            
                lda     _t1
_t1l    equ     *-2
                sta     X1
                sta     X2
               
                lda     scr
X1      equ     *-1
                ora     _t2
_t2l    equ     *-2                
                sta     scr
X2      equ     *-1

                lda     #0
sDLIA   equ     *-1                
		rti

VBL             sta     sVBIA
		stx     sVBIX

                ldx     #0
a0      equ     *-1                
                dex
                stx     a0
                stx     D0
            
                ldx     #0
a1      equ     *-1
                dex
                stx     a1
                stx     D1
            
                ldx     #$1f
                lda     #0
@               sta     scr,x
                dex
                bpl     @-

		lda     <mydlist
                sta     DLISTL

                lda     #0
sVBIA   equ     *-1
                ldx     #0
sVBIX   equ     *-1
		rti

mydlist		.byte   $4F+$80,<scr,>scr,$00,$4F,<scr,>scr
                .byte   $01,<mydlist,>mydlist

start		sei

                ldy     #0
_inc            lda     #$00
                sta     _t1,y
_ror            lda     #$80
                sta     _t2,y
                iny
                beq     @+
                lsr     @
                ror     _ror+1
                bcc     _inc
                inc     _inc+1
                bne     _inc
@
                lda     #$c0
                sta     nmien
@               lda     vcount
                bne     @-
                lda     #$21
                sta     dmactl
                
                rts

		ini     start

                org     $0c00

	:$c300	.byte   $ff		; create loading of data

run_adr		lda     #$74
                sta     colbak
                sta     colpf2
_stop           jmp     _stop		; endless loop

                run     run_adr

test.atr

Edited by xxl
  • Like 3
Link to comment
Share on other sites

counters during I/O: file offset & segment size.

reloc runad for fun.

xIRQEN          equ     xBIOS+$3ea ; User IRQ (1 byte)
xSEGMENT        equ     xBIOS+$3f4 ; Bytes to go in binary file segment (2 bytes)
xNOTE           equ     xBIOS+$3f6 ; File pointer (3 bytes)

PUPBT1	        equ	$033D	   ;power-up validation byte 1

		icl     'atarihw.ah'

		opt     h+o+l+

                org     $c00
start_sio       sei
                lda     #$00
                sta     nmien
                sta     irqen
                sta     xIRQEN
                sta     dmactl
                lda     #$fe
                sta     portb
                lda     <MyNMI
                sta     nmiv
                lda     >MyNMI
                sta     nmiv+1
                lda     <mydlist
                sta     dlistl
                lda     >mydlist
                sta     dlisth
                jsr     xBIOS_SET_DEFAULT_DEVICE        ; SIO drive
                ldx     >RESETV
                ldy     <RESETV
                jmp     xBIOS_SET_RUNAD         ; new runad vector
                ini     start_sio

                org     RESETV
                .word   run_adr ; RUN

                org     PUPBT1
                .byte   d'xxl'  ; let the RESET key works as RESET key

		org $0000

run_adr		lda     #$74
                sta     colbak
_stop           jmp     _stop		; endless loop

mydlist		
            :12 .byte $70
                .byte $46,<counter,>counter
                .byte $06
                .byte $41,<mydlist,>mydlist
counter         .byte d'SEGMENT:            '
                .byte d'FILE OFFSET:        '

start		sei
                ldx     #3
                ldy     #0
@               inc     PORTB
                lda     $e000,y
_csrc           equ     *-1                
                dec     PORTB
                sta     (_csrc-1),y
_cdst           equ     *-1                
                dey
                bne     @-
                inc     _csrc
                dex
                bpl     @-
@               lda     vcount
                bne     @-
		lda     #$22
                sta     dmactl
		lda     #$40
                sta     nmien
		rts
                
MyNMI 		sta     nmiA
		sty     nmiY

                inc     licz
                lda     #0
licz            equ     *-1
                lsr     @
                bcc     secondnmi
                
firstnmi        ldy     #16
                lda     xSEGMENT+1
                jsr     puthex
                lda     xSEGMENT
                jsr     puthex
                jmp     endnmi    
                
secondnmi       ldy     #20+14
                lda     xNOTE+2
                jsr     puthex
                lda     xNOTE+1
                jsr     puthex
                lda     xNOTE
                jsr     puthex

endnmi        	lda     #0
nmiA            equ     *-1
         	ldy     #0
nmiY            equ     *-1
		rti

puthex          pha
                lsr     @
                lsr     @
                lsr     @
                lsr     @
                jsr     nibble
                pla
                and     #$0f
nibble          cmp     #$0a
                sed
                adc     #$10
                cld
                sta     counter,y
                iny
                rts
            
                ini start

		org $0c00
                
	:$c300	.byte $ff

test.atr

  • Like 2
Link to comment
Share on other sites

simple example of playing music during I/O. but use for this purpose Konop's Delta Music Composer is a better idea.




opt h+o+l+

org PUPBT1
.byte d'xxl' ; let the RESET key works as RESET key

org $c00
start_sio sei
lda #$00
sta nmien
sta irqen
sta xIRQEN
sta dmactl
lda #$fe
sta portb
lda <MyNMI
sta nmiv
lda >MyNMI
sta nmiv+1
lda #$40
sta nmien
jmp xBIOS_SET_DEFAULT_DEVICE ; SIO drive

MyNMI sta vbisaveA+1
stx vbisaveX+1

speed lda #0
bne wp
loadpat ldx #0
lda pat,x
bmi pass
asl @
asl @
asl @
asl @
sta wp+1
pass inx
lda #$3f
sax loadpat+1
wp ldx #0
lda ins,x
sta audc1
lda frq,x
sta audf1
inc wp+1
dec speed+1
bpl pass2
lda #5
sta speed+1
wp1 lda #$20
sta pass2+1
eor #$60
sta wp1+1
pass2 ldx #0
lda ins,x
sta audc2
inc pass2+1

vbisaveA lda #0
vbisaveX ldx #0
rti

ins .byte $0F,$AF,$AC,$A7,$A2,$00,$04,$A3
.byte $22,$21,$A1,$00,$00,$00,$00,$00
.byte $AF,$AF,$09,$07,$05,$04,$04,$03
.byte $03,$03,$02,$02,$02,$01,$01,$00
.byte $87,$84,$83,$82,$81,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $84,$84,$84,$84,$84,$84,$83,$83
.byte $83,$83,$82,$82,$81,$81,$00,$00
.byte $83,$82,$81,$81,$81,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00

frq .byte $04,$C0,$D0,$E0,$F0,$00,$04,$C0
.byte $D0,$E0,$F0,$00,$00,$00,$00,$00
.byte $98,$A8,$03,$03,$03,$03,$03,$03
.byte $03,$03,$03,$03,$03,$03,$03,$03
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00

pat .byte $00,$80,$00,$80,$01,$80,$00,$00
.byte $80,$00,$00,$80,$01,$80,$03,$80
.byte $00,$80,$00,$80,$01,$80,$02,$02
.byte $00,$80,$01,$01,$80,$00,$03,$80
.byte $00,$80,$00,$80,$01,$80,$00,$00
.byte $80,$00,$00,$80,$01,$80,$03,$80
.byte $00,$00,$00,$80,$01,$00,$00,$80
.byte $00,$80,$01,$01,$80,$00,$01,$00

ini start_sio

org $1000
:$C000 .byte $ff
org $D800
:$2700 .byte $ff

run_adr lda #$74
sta colbak
_stop jmp _stop ; endless loop

run run_adr





as you see jsr xBIOS_SET_DEFAULT_DEVICE means "work on devices connected via SIO port".


the next examples will include programs that work with any device eg HDD. If anyone has doubts about the use of xB in a particular case then I can explain on examples.


test.atr

  • Like 2
Link to comment
Share on other sites

access to indexed data in same file. graphics data are compressed by LZ4.

xFILE           equ     xBIOS+$3ec ; file handle
xDAUX3          equ     xBIOS+$3f3 ; buffer offset if AtariDOS FS
xDAUX2          equ     xBIOS+$3fd ; sektor hi if AtariDOS FS
xDAUX1          equ     xBIOS+$3fe ; sektor lo if AtariDOS FS
PUPBT1	        equ	$033D	        ;power-up validation byte 1
myscr           equ     $8150
myscr1          equ     $9000
colour          equ     myscr+$1e01
fhandle         equ     $80

                org     PUPBT1
                .byte   d'xxl'          ; let the RESET key works as RESET key

                org     $c00

Mydlist         .byte   $70,$70,$70
                .byte   $4e,a(myscr)
            :93 .byte   $0e
                .byte   $4e,a(myscr1)
            :97 .byte   $0e
                .byte   $41,a(Mydlist)

myinit          lda     #$00
                sta     DMACTLS
                lda     <Mydlist
                sta     DLISTLS
                lda     >Mydlist
                sta     DLISTHS
                lda     #%00100010
                sta     DMACTLS

load_index      ldx     load_gfx+1
                lda     xDAUX1
                sta     fhandle,x
                lda     xDAUX2
                sta     fhandle+1,x
                lda     xDAUX3
                sta     fhandle+2,x
                cpx     #$0c
                bne     skip
                lda     #$100-(ldgfx+2-load_gfx)
                sta     ldgfx+1
                bne     skip
                
load_gfx        ldx     #0     
                lda     fhandle,x
                sta     xFILE
                lda     fhandle+1,x
                sta     xFILE+1
                jsr     xBIOS_OPEN_DEFAULT_FILE
                ldx     load_gfx+1
                lda     fhandle+2,x
                sta     xDAUX3
skip            lda     #%1111
                sbx     #$100-$04
                sax     load_gfx+1
                lda     <myscr
                sta     dest
                lda     >myscr
                sta     dest+1
                jsr     unlz4
                ldx     #$02
@               lda     colour,x
                sta     COLPF0S,x
                dex
                bpl     @-
ldgfx           bmi     load_index

unlz4           icl    'unlz4.asm'

                ini     myinit

                opt     h-
                ins     'DRUID.LZ4',$0b,.FILESIZE 'DRUID.LZ4'-$0b-$06
                ins     'LOADING.LZ4',$0b,.FILESIZE 'LOADING.LZ4'-$0b-$06
                ins     'SHPOON2.LZ4',$0b,.FILESIZE 'SHPOON2.LZ4'-$0b-$06
                ins     'POTATERR.LZ4',$0b,.FILESIZE 'POTATERR.LZ4'-$0b-$06

windows LZ4: http://fastcompression.blogspot.fr/p/lz4.html

 

6502 unLZ4: http://xxl.atari.pl/?p=1524

test.atr

  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...