view tmss.s68 @ 2069:8e51c0c3f2e3 segacd

Initial attempt at implementing the Sega CD graphics hardware
author Michael Pavone <pavone@retrodev.com>
date Sun, 30 Jan 2022 19:55:33 -0800
parents 5b51f03b2227
children f500831f7fb4
line wrap: on
line source

	dc.l $0, start
	dc.l empty_handler
	dc.l empty_handler
	;$10
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$20
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$30
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$40
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$50
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$60
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$70
	dc.l empty_handler
	dc.l empty_handler
	dc.l int_6
	dc.l empty_handler
	;$80
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$90
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$A0
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$B0
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$C0
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$D0
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$E0
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	;$F0
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.l empty_handler
	dc.b "SEGA IS COOL    "
	dc.b "(C)M.Pavone 2021"
	dc.b "TRAIN MEMES STAN"
	dc.b "D SILENTLY      "
	dc.b "                "
	dc.b "TRIUMPHANT MAMMA"
	dc.b "LS SALUTE SOCIAL"
	dc.b "ITES            "
	dc.b "MP 20210227-01",0,0
	dc.b "J               "
	dc.l $0
	dc.l romend-1
	dc.l $FF0000
	dc.l $FFFFFF
	dc.b "                "
	dc.b "                "
	dc.b "                "
	dc.b "                "
	dc.b "JUE             "
	
frame_counter equ $FFFF8000
ram_code equ $FFFF8002

empty_handler:
	rte
start:
	lea $A14000, a3
	move.l #'SEGA', (a3)
	lea $C00000, a0
	lea $C00004, a1
	move.w #$8104, (a1) ;Mode 5, everything turned off
	move.w #$8004, (a1)
	move.w #$8220, (a1) ;Scroll a table $8000
	move.w #$8404, (a1) ;Scroll b table $8000
	move.w #$8560, (a1) ;SAT table $C000
	move.w #$8700, (a1) ;backdrop color 0
	move.w #$8A01, (a1) ;Set HINT counter
	move.w #$8B00, (a1) ;full screen scroll
	move.w #$8C81, (a1) ;40 cell mode, no interlace
	move.w #$8D00, (a1) ;hscroll table at 0
	move.w #$8F02, (a1) ;autoinc 2
	move.w #$9011, (a1) ;64x64 scroll size
	move.l #$C0000000, (a1)
	move.w #$000, (a0)
	move.w #$EEE, (a0)

	;clear scroll table
	move.l #$40000000, (a1)
	move.l #0, (a0)

	;load tiles
	move.l #$44000000, (a1)
	lea font, a2
	move.w #((fontend-font)/4 - 1), d0
tloop:
	move.l (a2)+, (a0)
	dbra d0, tloop

	;clear name table
	move.l #$40000002, (a1)
	moveq #32, d0
	move.w #(64*64-1), d1
ploop:
	move.w d0, (a0)
	dbra d1, ploop
	move.l #$45960002, d7
	move.l d7, (a1)
	move.l #$800000, d6
	
	lea ram_code_src(pc), a6
	lea ram_code.w, a5
	moveq #(font-ram_code_src)/2-1, d0
copy:
	move.w (a6)+, (a5)+
	dbra d0, copy
	lea $101(a3), a4
	lea $100.w, a5
	move.l #'SEGA', d5
	move.l #' SEG', d4
	moveq #0, d0
	moveq #1, d2
	move.w #180, d3
	btst #6, $A10001
	beq .not_pal
	move.w #150, d3
.not_pal:
	jmp ram_code.w

ram_code_src:
	move.b d2, (a4)
	cmp.l (a5), d5
	beq.s is_good
	cmp.l (a5), d4
	bne.s is_bad
is_good:
	move.b d0, (a4)
	lea good(pc), a6
	bsr.s print_string
	
	add.l d6, d7
	move.l d7, (a1)
	bsr.s print_string
	
	add.l d6, d7
	move.l d7, (a1)
	bsr.s print_string

	move.w #$8164, (a1)
	move #$2500, SR
wait:
	cmp.w frame_counter.w, d3
	bne.s wait
	move #$2700, SR
	move.b d2, (a4)
	move.l $0.w, a7
	move.l $4.w, a6
	move.w #$8104, (a1)
	move.l d0, (a3)
	jmp (a6)
	
is_bad:
	move.b d0, (a4)
	lea bad(pc), a6
	bsr.s print_string
	
	add.l d6, d7
	move.l d7, (a1)
	bsr.s print_string
	
	add.l d6, d7
	move.l d7, (a1)
	bsr.s print_string
	
	move.w #$8144, (a1)
forever:
	bra.s forever


int_6:
	addq.w #1, frame_counter.w
	rte

;Prints a null terminated string
;a6 - pointer to string
;a0 - VDP data port
;d0 - base tile attribute
;
;Clobbers: d1.w
print_string:
.loop
	moveq #0, d1
	move.b (a6)+, d1
	beq .end
	add.w d0, d1
	move.w d1, (a0)
	bra .loop
.end
	rts
	
good:
	dc.b "  BLASTEM THINKS", 0
	dc.b "  THAT THIS CART", 0
	dc.b " TASTES DELICIOUS!", 0
	
bad:
	dc.b "  *sniff* *sniff*", 0
	dc.b " something doesn't", 0
	dc.b "  smell right...", 0

	align 1
font:
	incbin font.tiles
fontend

romend