123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635 |
- .6502
- .include "MARIA.S"
- .title "Sample Atari 7800 "
- .subttl "zero page declarations"
- ROM = $f000 ; start of ROM cart
- .org $40
- INDPT1: .ds.w 1
- INDPT2: .ds.w 1
- INDPT3: .ds.w 1
- v1fBB: .ds.b 1 ;save .a in outchar
- v1fBC: .ds.b 1 ;save .x in outchar
- v1fBD: .ds.b 1 ;save .y in outchar
- v1fBE: .ds.b 1 ;loop counter in outchar
- v1fC0: .ds.b 1 ;temp var used in subrk
- count: .ds.b 1
- sdppl: .ds.b 1 ;shadow of display list list
- sdpph: .ds.b 1
- .subttl "ram subroutines and display list data"
- .org RAM3
- dllist: ds.b 96
- filler: ds.b 6
- line1: ds.b 12
- line2: ds.b 12
- line3: ds.b 12
- line4: ds.b 12
- line5: ds.b 12
- line6: ds.b 12
- line7: ds.b 12
- line8: ds.b 12
- line9: ds.b 12
- line10: ds.b 12
- line11: ds.b 12
- line12: ds.b 12
- line13: ds.b 12
- line14: ds.b 12
- line15: ds.b 12
- line16: ds.b 12
- line17: ds.b 12
- line18: ds.b 12
- line19: ds.b 12
- line20: ds.b 12
- line21: ds.b 12
- line22: ds.b 12
- line23: ds.b 12
- line24: ds.b 12
- .subttl "video matrix ram"
- .org $2400
- columns = 40 ;number of characters per line
- SCREEN:
- row1: ds.b columns
- row2: ds.b columns
- row3: ds.b columns
- row4: ds.b columns
- row5: ds.b columns
- row6: ds.b columns
- row7: ds.b columns
- row8: ds.b columns
- row9: ds.b columns
- row10: ds.b columns
- row11: ds.b columns
- row12: ds.b columns
- row13: ds.b columns
- row14: ds.b columns
- row15: ds.b columns
- row16: ds.b columns
- row17: ds.b columns
- row18: ds.b columns
- row19: ds.b columns
- row20: ds.b columns
- row21: ds.b columns
- row22: ds.b columns
- row23: ds.b columns
- row24: ds.b columns
- .subttl "begin ROM -- RAM routines"
- .org ROM
- ; here begins the display list list
- display 0,0,0,7,filler
- display 0,0,0,7,filler
- display 0,0,0,7,filler
- display 0,0,0,0,filler
- display 0,0,0,7,line1
- display 0,0,0,7,line2
- display 0,0,0,7,line3
- display 0,0,0,7,line4
- display 0,0,0,7,line5
- display 0,0,0,7,line6
- display 0,0,0,7,line7
- display 0,0,0,7,line8
- display 0,0,0,7,line9
- display 0,0,0,7,line10
- display 0,0,0,7,line11
- display 0,0,0,7,line12
- display 0,0,0,7,line13
- display 0,0,0,7,line14
- display 0,0,0,7,line15
- display 0,0,0,7,line16
- display 0,0,0,7,line17
- display 0,0,0,7,line18
- display 0,0,0,7,line19
- display 0,0,0,7,line20
- display 0,0,0,7,line21
- display 0,0,0,7,line22
- display 0,0,0,7,line23
- display 0,0,0,7,line24
- display 0,0,0,7,filler
- display 0,0,0,7,filler
- display 0,0,0,7,filler
- display 0,0,0,1,filler
- .subttl "display lists"
- ;here are the display lists referenced in the display list list
- ;filler
- header RAM1,0,0,0 ;address,palette,width,hpos
- nullhdr
- ;line1
- xheader row1,0,20,0,0,1 ;address,palette,width,hpos,wm,ind
- xheader row1+(columns/2),0,20,80,0,1
- nullhdr
- ;line2
- xheader row2,0,20,0,0,1
- xheader row2+(columns/2),0,20,80,0,1
- nullhdr
- ;line3
- xheader row3,0,20,0,0,1
- xheader row3+(columns/2),0,20,80,0,1
- nullhdr
- ;line4
- xheader row4,0,20,0,0,1
- xheader row4+(columns/2),0,20,80,0,1
- nullhdr
- ;line5
- xheader row5,0,20,0,0,1
- xheader row5+(columns/2),0,20,80,0,1
- nullhdr
- ;line6
- xheader row6,0,20,0,0,1
- xheader row6+(columns/2),0,20,80,0,1
- nullhdr
- ;line7
- xheader row7,0,20,0,0,1
- xheader row7+(columns/2),0,20,80,0,1
- nullhdr
- ;line8
- xheader row8,0,20,0,0,1
- xheader row8+(columns/2),0,20,80,0,1
- nullhdr
- ;line9
- xheader row9,0,20,0,0,1
- xheader row9+(columns/2),0,20,80,0,1
- nullhdr
- ;line10
- xheader row10,0,20,0,0,1
- xheader row10+(columns/2),0,20,80,0,1
- nullhdr
- ;line11
- xheader row11,0,20,0,0,1
- xheader row11+(columns/2),0,20,80,0,1
- nullhdr
- ;line12
- xheader row12,0,20,0,0,1
- xheader row12+(columns/2),0,20,80,0,1
- nullhdr
- ;line13
- xheader row13,0,20,0,0,1
- xheader row13+(columns/2),0,20,80,0,1
- nullhdr
- ;line14
- xheader row14,0,20,0,0,1
- xheader row14+(columns/2),0,20,80,0,1
- nullhdr
- ;line15
- xheader row15,0,20,0,0,1
- xheader row15+(columns/2),0,20,80,0,1
- nullhdr
- ;line16
- xheader row16,0,20,0,0,1
- xheader row16+(columns/2),0,20,80,0,1
- nullhdr
- ;line17
- xheader row17,0,20,0,0,1
- xheader row17+(columns/2),0,20,80,0,1
- nullhdr
- ;line18
- xheader row18,0,20,0,0,1
- xheader row18+(columns/2),0,20,80,0,1
- nullhdr
- ;line19
- xheader row19,0,20,0,0,1
- xheader row19+(columns/2),0,20,80,0,1
- nullhdr
- ;line20
- xheader row20,0,20,0,0,1
- xheader row20+(columns/2),0,20,80,0,1
- nullhdr
- ;line21
- xheader row21,0,20,0,0,1
- xheader row21+(columns/2),0,20,80,0,1
- nullhdr
- ;line22
- xheader row22,0,20,0,0,1
- xheader row22+(columns/2),0,20,80,0,1
- nullhdr
- ;line23
- xheader row23,0,20,0,0,1
- xheader row23+(columns/2),0,20,80,0,1
- nullhdr
- ;line24
- xheader row24,0,20,0,0,1
- xheader row24+(columns/2),0,20,80,0,1
- nullhdr
- .subttl "Character generation data"
- ;The data here is represented so that every 128 bytes sequentially is the next
- ;row of the 8 x 8 character represented. As an example, the first row of a
- ;capital A is located at table + $41, the second at table + $41 + $80, etc.
- table:
- dc.b $00,$7E,$7E,$6C,$10,$38,$10,$00
- dc.b $FF,$00,$FF,$0F,$3C,$3F,$7F,$99
- dc.b $80,$02,$18,$66,$7F,$3E,$00,$18
- dc.b $18,$18,$00,$00,$00,$00,$00,$00
- dc.b $00,$30,$6C,$6C,$30,$00,$38,$60
- dc.b $18,$60,$00,$00,$00,$00,$00,$06
- dc.b $7C,$30,$78,$78,$1C,$FC,$38,$FC
- dc.b $78,$78,$00,$00,$18,$00,$60,$78
- dc.b $7C,$30,$FC,$3C,$F8,$FE,$FE,$3C
- dc.b $CC,$78,$1E,$E6,$F0,$C6,$C6,$38
- dc.b $FC,$78,$FC,$78,$FC,$CC,$CC,$C6
- dc.b $C6,$CC,$FE,$78,$C0,$78,$10,$00
- dc.b $30,$00,$E0,$00,$1C,$00,$38,$00
- dc.b $E0,$30,$0C,$E0,$70,$00,$00,$00
- dc.b $00,$00,$00,$00,$10,$00,$00,$00
- dc.b $00,$00,$00,$1C,$18,$E0,$76,$00
- dc.b $00,$81,$FF,$FE,$38,$7C,$10,$00
- dc.b $FF,$3C,$C3,$07,$66,$33,$63,$5A
- dc.b $E0,$0E,$3C,$66,$DB,$63,$00,$3C
- dc.b $3C,$18,$18,$30,$00,$24,$18,$FF
- dc.b $00,$78,$6C,$6C,$7C,$C6,$6C,$60
- dc.b $30,$30,$66,$30,$00,$00,$00,$0C
- dc.b $C6,$70,$CC,$CC,$3C,$C0,$60,$CC
- dc.b $CC,$CC,$30,$30,$30,$00,$30,$CC
- dc.b $C6,$78,$66,$66,$6C,$62,$62,$66
- dc.b $CC,$30,$0C,$66,$60,$EE,$E6,$6C
- dc.b $66,$CC,$66,$CC,$B4,$CC,$CC,$C6
- dc.b $C6,$CC,$C6,$60,$60,$18,$38,$00
- dc.b $30,$00,$60,$00,$0C,$00,$6C,$00
- dc.b $60,$00,$00,$60,$30,$00,$00,$00
- dc.b $00,$00,$00,$00,$30,$00,$00,$00
- dc.b $00,$00,$00,$30,$18,$30,$DC,$10
- dc.b $00,$A5,$DB,$FE,$7C,$38,$38,$18
- dc.b $E7,$66,$99,$0F,$66,$3F,$7F,$3C
- dc.b $F8,$3E,$7E,$66,$DB,$38,$00,$7E
- dc.b $7E,$18,$0C,$60,$C0,$66,$3C,$FF
- dc.b $00,$78,$6C,$FE,$C0,$CC,$38,$C0
- dc.b $60,$18,$3C,$30,$00,$00,$00,$18
- dc.b $CE,$30,$0C,$0C,$6C,$F8,$C0,$0C
- dc.b $CC,$CC,$30,$30,$60,$FC,$18,$0C
- dc.b $DE,$CC,$66,$C0,$66,$68,$68,$C0
- dc.b $CC,$30,$0C,$6C,$60,$FE,$F6,$C6
- dc.b $66,$CC,$66,$E0,$30,$CC,$CC,$C6
- dc.b $6C,$CC,$8C,$60,$30,$18,$6C,$00
- dc.b $18,$78,$60,$78,$0C,$78,$60,$76
- dc.b $6C,$70,$0C,$66,$30,$CC,$F8,$78
- dc.b $DC,$76,$DC,$7C,$7C,$CC,$CC,$C6
- dc.b $C6,$CC,$FC,$30,$18,$30,$00,$38
- dc.b $00,$81,$FF,$FE,$FE,$FE,$7C,$3C
- dc.b $C3,$42,$BD,$7D,$66,$30,$63,$E7
- dc.b $FE,$FE,$18,$66,$7B,$6C,$00,$18
- dc.b $18,$18,$FE,$FE,$C0,$FF,$7E,$7E
- dc.b $00,$30,$00,$6C,$78,$18,$76,$00
- dc.b $60,$18,$FF,$FC,$00,$FC,$00,$30
- dc.b $DE,$30,$38,$38,$CC,$0C,$F8,$18
- dc.b $78,$7C,$00,$00,$C0,$00,$0C,$18
- dc.b $DE,$CC,$7C,$C0,$66,$78,$78,$C0
- dc.b $FC,$30,$0C,$78,$60,$FE,$DE,$C6
- dc.b $7C,$CC,$7C,$70,$30,$CC,$CC,$D6
- dc.b $38,$78,$18,$60,$18,$18,$C6,$00
- dc.b $00,$0C,$7C,$CC,$7C,$CC,$F0,$CC
- dc.b $76,$30,$0C,$6C,$30,$FE,$CC,$CC
- dc.b $66,$CC,$76,$C0,$30,$CC,$CC,$D6
- dc.b $5C,$CC,$98,$E0,$00,$1C,$00,$6C
- dc.b $00,$BD,$C3,$7C,$7C,$FE,$FE,$3C
- dc.b $C3,$42,$BD,$CC,$3C,$30,$63,$E7
- dc.b $F8,$3E,$18,$66,$1B,$6C,$7E,$7E
- dc.b $18,$7E,$0C,$60,$C0,$66,$FF,$3C
- dc.b $00,$30,$00,$FE,$0C,$30,$DC,$00
- dc.b $60,$18,$3C,$30,$00,$00,$00,$60
- dc.b $F6,$30,$60,$0C,$FE,$0C,$CC,$30
- dc.b $CC,$0C,$00,$00,$60,$00,$18,$30
- dc.b $DE,$FC,$66,$C0,$66,$68,$68,$CE
- dc.b $CC,$30,$CC,$6C,$62,$D6,$CE,$C6
- dc.b $60,$DC,$6C,$1C,$30,$CC,$CC,$FE
- dc.b $38,$30,$32,$60,$0C,$18,$00,$00
- dc.b $00,$7C,$66,$C0,$CC,$FC,$60,$CC
- dc.b $66,$30,$0C,$78,$30,$FE,$CC,$CC
- dc.b $66,$CC,$66,$78,$30,$CC,$CC,$FE
- dc.b $38,$CC,$30,$30,$18,$30,$00,$C6
- dc.b $00,$99,$E7,$38,$38,$7C,$7C,$18
- dc.b $E7,$66,$99,$CC,$18,$70,$67,$3C
- dc.b $E0,$0E,$7E,$00,$1B,$38,$7E,$3C
- dc.b $18,$3C,$18,$30,$FE,$24,$FF,$18
- dc.b $00,$00,$00,$6C,$F8,$66,$CC,$00
- dc.b $30,$30,$66,$30,$30,$00,$30,$C0
- dc.b $E6,$30,$CC,$CC,$0C,$CC,$CC,$30
- dc.b $CC,$18,$30,$30,$30,$FC,$30,$00
- dc.b $C0,$CC,$66,$66,$6C,$62,$60,$66
- dc.b $CC,$30,$CC,$66,$66,$C6,$C6,$6C
- dc.b $60,$78,$66,$CC,$30,$CC,$78,$EE
- dc.b $6C,$30,$66,$60,$06,$18,$00,$00
- dc.b $00,$CC,$66,$CC,$CC,$C0,$60,$7C
- dc.b $66,$30,$CC,$6C,$30,$D6,$CC,$CC
- dc.b $7C,$7C,$60,$0C,$34,$CC,$78,$FE
- dc.b $6C,$7C,$64,$30,$18,$30,$00,$C6
- dc.b $00,$81,$FF,$10,$10,$38,$38,$00
- dc.b $FF,$3C,$C3,$CC,$7E,$F0,$E6,$5A
- dc.b $80,$02,$3C,$66,$1B,$CC,$7E,$18
- dc.b $18,$18,$00,$00,$00,$00,$00,$00
- dc.b $00,$30,$00,$6C,$30,$C6,$76,$00
- dc.b $18,$60,$00,$00,$30,$00,$30,$80
- dc.b $7C,$FC,$FC,$78,$1E,$78,$78,$30
- dc.b $78,$70,$30,$30,$18,$00,$60,$30
- dc.b $78,$CC,$FC,$3C,$F8,$FE,$F0,$3E
- dc.b $CC,$78,$78,$E6,$FE,$C6,$C6,$38
- dc.b $F0,$1C,$E6,$78,$78,$FC,$30,$C6
- dc.b $C6,$78,$FE,$78,$02,$78,$00,$00
- dc.b $00,$76,$DC,$78,$76,$78,$F0,$0C
- dc.b $E6,$78,$CC,$E6,$78,$C6,$CC,$78
- dc.b $60,$0C,$F0,$F8,$18,$76,$30,$6C
- dc.b $C6,$0C,$FC,$1C,$18,$E0,$00,$FE
- dc.b $00,$7E,$7E,$00,$00,$7C,$7C,$00
- dc.b $FF,$00,$FF,$78,$18,$E0,$C0,$99
- dc.b $00,$00,$18,$00,$00,$78,$00,$FF
- dc.b $00,$00,$00,$00,$00,$00,$00,$00
- dc.b $00,$00,$00,$00,$00,$00,$00,$00
- dc.b $00,$00,$00,$00,$60,$00,$00,$00
- dc.b $00,$00,$00,$00,$00,$00,$00,$00
- dc.b $00,$00,$00,$00,$00,$00,$00,$00
- dc.b $00,$00,$00,$00,$00,$00,$00,$00
- dc.b $00,$00,$00,$00,$00,$00,$00,$00
- dc.b $00,$00,$00,$00,$00,$00,$00,$00
- dc.b $00,$00,$00,$00,$00,$00,$00,$FF
- dc.b $00,$00,$00,$00,$00,$00,$00,$F8
- dc.b $00,$00,$78,$00,$00,$00,$00,$00
- dc.b $F0,$1E,$00,$00,$00,$00,$00,$00
- dc.b $00,$F8,$00,$00,$00,$00,$00,$00
- .subttl "main program"
- ; place for IRQ and NMI to attach
- dummy:
- rti
- main:
- sei
- cld
- ldx #$FF ;init stack
- txs
- lda #$7
- ; sta PTCTRL
- lda #$7f
- sta CTRL
- inx
- loop:
- ;move display list list to RAM
- lda ROM,x
- sta RAM3,x
- lda ROM+$100,x
- sta RAM3+$100,x
- ;move character rom data
- ;Maria fetches character data every 256 locations so the character
- ;ROM data is thus spread out from the packed ROM representation
- lda table,x
- sta RAM1+$700,x
- lda table+$80,x
- sta RAM1+$600,x
- lda table+$100,x
- sta RAM1+$500,x
- lda table+$180,x
- sta RAM1+$400,x
- lda table+$200,x
- sta RAM1+$300,x
- lda table+$280,x
- sta RAM1+$200,x
- lda table+$300,x
- sta RAM1+$100,x
- lda table+$380,x
- sta RAM1,x
- inx
- bne loop
- main30:
- bit MSTAT ;Vblank?
- bmi main30 ;wait while it is on...
- main32:
- bit MSTAT ;Vblank?
- bpl main32 ;wait until it comes back...
- lda #RAM1 >> 8
- sta CHBASE ;character base address.
- dppload dllist ;init display list list.
- screen 1,2,0,1,0,3 ;Maria setups:
- ;0=normal color.
- ;2=Normal DMA.
- ;0=single byte wide characters.
- ;1=background colored border.
- ;0=transparency mode.
- ;3=320 a or c mode.
- around:
- lda #$0
- sta BKGRND ;maria background color register
- lda #$0e
- sta P0C2 ;maria pallette 0 - color 2
- jsr clear ;clear screen
- main40:
- lda #0
- sta v1fC0
- main50:
- lda v1fC0
- cmp #$0d
- beq main60
- jsr outchar
- main60: inc v1fC0
- cmp #$7f
- bne main50
- beq main40
- outchar:
- sta v1fBB ;save all registers
- stx v1fBC
- sty v1fBD
- outc10:
- lda SWCHB ;read console switches
- and #PAUSE ;PAUSE down?
- beq outc10 ;yes ... wait until released
- lda v1fBB ;restore character to print
- and #$7F ;strip off high bit
- cmp #$0D ;see if a carriage return
- bne outc2 ;no ...
- ldx #0 ;search for start of next line
- outc11:
- sec
- lda lines,x
- sbc INDPT2
- lda lines+1,x
- sbc INDPT2+1
- bcs outc15 ;found a line start >=
- inx
- inx
- cpx #46 ;end of table?
- bcc outc11 ;keep looking...
- outc15:
- lda lines,x ;start of next line
- sta INDPT2
- lda lines+1,x
- sta INDPT2+1
- jmp doneoutc ;done ...
- outc2:
- sec
- lda INDPT2
- sbc #(row24+columns) & $ff ;beyond end of screen?
- lda INDPT2+1
- sbc #(row24+columns) >> 8
- bcs outc3 ;yes ...
- jmp outc6b ;no ... o.k. to print
- outc3:
- lda #$03 ;outer loop counter (3 pages)
- sta v1fBE
- lda #SCREEN & $ff ;init pointers to begin of screen
- sta INDPT2
- lda #SCREEN >> 8
- sta INDPT2+1
- outc3a:
- ldx #$00
- outc3b:
- ldy #columns ;get one line ahead
- lda (INDPT2),y
- ldy #$00
- sta (INDPT2),y ;store it where we are
- inc INDPT2 ;advance pointer to next position
- bne outc4
- inc INDPT2+1
- outc4:
- inx
- bne outc3b
- dec v1fBE
- bpl outc3a
- lda #row24 & $ff
- sta INDPT2
- lda #row24 >> 8
- sta INDPT2+1
- ldx #columns-1 ;clear the last line
- lda #$00
- outc6:
- sta row24+columns,x
- sta row24,x
- dex
- bpl outc6
- outc6b:
- ldy #$00
- lda v1fBB ;get back saved character
- and #$7F ;mask off high bit
- cmp #$0D ;carriage return?
- beq doneoutc ;yes ...
- sta (INDPT2),y ;put character in video matrix
- inc INDPT2 ;increment lo of char pointer
- bne doneoutc ;no carry ...
- inc INDPT2+1 ;increment hi of char pointer
- doneoutc:
- lda v1fBB ;restore registers
- ldx v1fBC
- ldy v1fBD
- rts
- outstring:
- stx INDPT3
- sty INDPT3+1
- ldy #$00
- outs10:
- lda (INDPT3),y
- beq outs20
- jsr outchar
- inc INDPT3
- bne outs10
- inc INDPT3+1
- jmp outs10
- outs20:
- rts
- lines:
- .dc.w row2
- .dc.w row3
- .dc.w row4
- .dc.w row5
- .dc.w row6
- .dc.w row7
- .dc.w row8
- .dc.w row9
- .dc.w row10
- .dc.w row11
- .dc.w row12
- .dc.w row13
- .dc.w row14
- .dc.w row15
- .dc.w row16
- .dc.w row17
- .dc.w row18
- .dc.w row19
- .dc.w row20
- .dc.w row21
- .dc.w row22
- .dc.w row23
- .dc.w row24
- .dc.w row1
- outbyte:
- pha
- lsr
- lsr
- lsr
- lsr
- jsr outdigit
- pla
- outdigit:
- and #$0F
- clc
- adc #$30
- cmp #$3A
- bcc subrf1
- clc
- adc #$07
- subrf1:
- jmp outchar
- ; subroutine to clear the video display character matrix
- clear:
- lda #$00
- tax
- clr010:
- sta SCREEN,x ;zero display by pages
- sta SCREEN+$100,x
- sta SCREEN+$200,x
- sta row24+columns-$100,x
- inx
- bne clr010
- lda #$ff & SCREEN ;home the cursor position
- sta INDPT2
- lda #SCREEN >> 8
- sta INDPT2+1
- rts
- .org $FFF8
- .dc.w $F7FF
- .dc.w dummy ;NMI
- .dc.w main ;RESET
- .dc.w dummy ;IRQ
|