1
0
mirror of https://github.com/KarolS/millfork.git synced 2024-12-24 15:29:23 +00:00
millfork/include/atari_lynx_hardware.mfk

198 lines
4.3 KiB
Plaintext
Raw Normal View History

2019-09-19 23:43:58 +00:00
#if not(ATARI_LYNX)
2019-09-18 00:49:03 +00:00
#warn atari lynx module should be only used on atari lynx
#endif
2019-09-19 23:43:58 +00:00
import joy
// TODO: mark them correctly as volatile:
2019-09-18 00:59:46 +00:00
word TMPADRL @$fc00
word TILTACUM @$fc02
2019-09-18 00:58:37 +00:00
word HOFF @$fc04
word VOFF @$fc06
word VIDBASE @$fc08
word COLLBASE @$fc0a
word VIDADRL @$fc0c
word COLLADRL @$fc0e
word SCBNEXT @$fc10
word SPRDLINE @$fc12
word HPOSSTRT @$fc14
word VPOSSTRT @$fc16
word SPRHSIZ @$fc18
word SPRVSIZ @$fc1a
word STRETCH @$fc1c
word TILT @$fc1e
word SPRDOFF @$fc20
word SPRVPOS @$fc22
word COLLOFF @$fc24
word VSIZACUM @$fc26
word HSIZOFF @$fc28
word VSIZOFF @$fc2a
word SCBADR @$fc2c
word PROCADR @$fc2e
byte SPRCTRL0 @$fc80
byte SPRCTRL1 @$fc81
byte SPRCOLL @$fc82
byte SPRINT @$fc83
volatile byte SUZYBUSEN @$fc90
volatile byte SPRGO @$fc91
volatile byte SPRSYS @$fc92
2019-09-18 00:58:37 +00:00
2019-09-19 23:43:58 +00:00
volatile byte JOYSTICK @$fcb0
volatile byte SWITCHES @$fcb1
2019-09-18 00:49:03 +00:00
word DISPADR @$fd94
byte SUZYDONEACK @$fd90
byte CPUSLEEP @$fd91
byte DISPCTRL @$fd92
byte PBKUP @$fd93
byte INTSET @$fd81
2019-09-19 23:43:58 +00:00
volatile byte TIMER0_reload @$fd00
volatile byte TIMER0_ctrl @$fd01
volatile byte TIMER0_count @$fd02
volatile byte TIMER0_ctrl2 @$fd03
2019-09-18 00:49:03 +00:00
2019-09-19 23:43:58 +00:00
volatile byte TIMER1_reload @$fd04
volatile byte TIMER1_ctrl @$fd05
volatile byte TIMER1_count @$fd06
volatile byte TIMER1_ctrl2 @$fd07
2019-09-18 00:49:03 +00:00
// video vertical position
2019-09-19 23:43:58 +00:00
volatile byte TIMER2_reload @$fd08
volatile byte TIMER2_ctrl @$fd09
volatile byte TIMER2_count @$fd0a
volatile byte TIMER2_ctrl2 @$fd0b
volatile byte RASTER @$fd0a
volatile byte TIMER3_reload @$fd0c
volatile byte TIMER3_ctrl @$fd0d
volatile byte TIMER3_count @$fd0e
volatile byte TIMER3_ctrl2 @$fd0f
volatile byte TIMER4_reload @$fd10
volatile byte TIMER4_ctrl @$fd11
volatile byte TIMER4_count @$fd12
volatile byte TIMER4_ctrl2 @$fd13
volatile byte TIMER5_reload @$fd14
volatile byte TIMER5_ctrl @$fd15
volatile byte TIMER5_count @$fd16
volatile byte TIMER5_ctrl2 @$fd17
volatile byte TIMER6_reload @$fd18
volatile byte TIMER6_ctrl @$fd19
volatile byte TIMER6_count @$fd1a
volatile byte TIMER6_ctrl2 @$fd1b
volatile byte TIMER7_reload @$fd1c
volatile byte TIMER7_ctrl @$fd1d
volatile byte TIMER7_count @$fd1e
volatile byte TIMER7_ctrl2 @$fd1f
2019-09-18 00:49:03 +00:00
const byte DISPLAY_COLOR=%1000
const byte DISPLAY_4bpp=%0100
const byte DISPLAY_FLIPPED=%0010
const byte DISPLAY_ENABLE=%0001
// suzy sprite type
2019-09-18 00:58:37 +00:00
const byte TYPE_BACKGROUND =00
const byte TYPE_BACKNONCOLL =01
const byte TYPE_BSHADOW =02
const byte TYPE_BOUNDARY =03
const byte TYPE_NORMAL =04
const byte TYPE_NONCOLL =05
const byte TYPE_XOR =06
const byte TYPE_SHADOW =07
2019-09-18 00:49:03 +00:00
// suzy drawing flags
2019-09-18 00:58:37 +00:00
const byte LITERAL =$80
const byte PACKED =$00
const byte ALGO3 =$40
const byte RENONE =$00
const byte REHV =$10
const byte REHVS =$20
const byte REHVST =$30
const byte REUSEPAL =$08
const byte SKIP =$04
const byte DRAWUP =$02
const byte DRAWLEFT =$01
2019-09-18 00:49:03 +00:00
const byte BPP_1 = %00000000
const byte BPP_2 = %01000000
const byte BPP_3 = %10000000
const byte BPP_4 = %11000000
const byte HFLIP = $20
const byte VFLIP = $10
array(byte) palette_ram_green[16] @$FDA0
array(byte) palette_ram_blue_red[16] @$FDb0
//joystick
2019-09-18 00:58:37 +00:00
const byte BTN_A=%00000001
const byte BTN_B=%00000010
const byte BTN_R=%00010000
const byte BTN_L=%00100000
const byte BTN_D=%01000000
2019-09-19 23:43:58 +00:00
const byte BTN_U=%10000000
alias input_a = input_btn
byte input_b
void lynx_reset_joy() {
input_dx = 0
input_dy = 0
input_btn = 0
input_b = 0
}
alias reset_joy = lynx_reset_joy!
2019-09-18 00:49:03 +00:00
2019-09-19 23:43:58 +00:00
inline void read_joy() {
2019-09-18 00:49:03 +00:00
reset_joy()
if JOYSTICK & BTN_U != 0 { input_dy += 1 }
if JOYSTICK & BTN_D != 0 { input_dy -= 1 }
if JOYSTICK & BTN_R != 0 { input_dx += 1 }
if JOYSTICK & BTN_L != 0 { input_dx -= 1 }
2019-09-19 23:43:58 +00:00
if JOYSTICK & BTN_A != 0 { input_a = 1 }
if JOYSTICK & BTN_B != 0 { input_b = 1 }
2019-09-18 00:49:03 +00:00
}
void lynx_init() {
// vid memory to the furthest point from code
// right at the top of ram
DISPADR=$dc00
VIDBASE=$dc00
COLLBASE=$bc00
// reset Horizontal and Vertical offset regs
HOFF = 0
VOFF = 0
// suzy and display
SPRSYS = 0
SPRINT = $f3
DISPCTRL = DISPLAY_COLOR | DISPLAY_4bpp | DISPLAY_ENABLE
SUZYBUSEN = 1
// set 60hz display
TIMER0_reload=$9e
TIMER0_ctrl=$18
TIMER2_reload=$68
TIMER2_ctrl=$1f
// TIMER2_ctrl = %11011000
PBKUP=$29
}
// wait for suzy to finish rendering
void lynx_wait_suzy() {
asm {
2019-09-18 00:58:37 +00:00
waitsuzy:
2019-09-18 00:49:03 +00:00
stz CPUSLEEP
lda SPRSYS
lsr
bcs waitsuzy
}
}