8bitworkshop/presets/astrocade/03-horcbpal.asm

89 lines
5.3 KiB
NASM

; "HORCB Pal" demo 2018 hxlnt
; Inspired by Michael Garber's Color Picker
; http://ballyalley.com/ml/ml_homebrew/colorpicker.asm
; Assemble with Zmac 1.3
; From: https://github.com/hxlnt/astrocade
INCLUDE "hvglib.h" ; Include HVGLIB library
FrameCount EQU $4F00 ; Reserve a space for a frame counter
ORG FIRSTC ; Initialize at beginning of cartridge ROM area
DB $55 ; ... with the code for a normal menued cartridge
DW MENUST ; Initialize menu
DW PrgName ; ... with string at PrgName
DW PrgStart ; ... such that selecting the program enters PrgStart
PrgName: DB "HORCB PAL" ; String
DB 0 ; ... which must be followed by 0
PrgStart: DI ; Disable interrupts
SYSTEM INTPC ; Begin interpreter mode
DO SETOUT ; Set output ports
DB 96*2 ; ... with VBLANK line set to line 96
DB 0/4 ; ... with color boundary 0 pixels from the left of the screen
DB 00001000b ; ... with screen interrupts enabled
DO COLSET ; Set color palettes
DW Palettes ; ... with the values at Palettes
DO FILL ; Set background fill
DW NORMEM ; ... starting at the beginning of screen RAM
DW 24*BYTEPL ; ... and going for 24 lines
DB 00011011b ; ... with a fill pattern of four different colored pixels
DO FILL ; Set background fill
DW NORMEM+(24*BYTEPL)
DW 24*BYTEPL ; ... and going for 24 lines
DB 00000000b ; ... with a solid fill of color 00
DO FILL ; Set background fill
DW NORMEM+(48*BYTEPL)
DW 24*BYTEPL ; ... and going for 24 lines
DB 11111111b ; ... with a solid fill of color 11
DO STRDIS ; Set string display
DB 28 ; ... starting 28 pixels from the left of the screen
DB 40 ; ... and 40 pixels from the top of the screen
DB 00001100b ; ... with no enlargement, foreground color = 11, background color = 00
DW PrgName ; ... with string at PrgName
EXIT ; Exit interpreter mode
Loop: IN A,(POT0) ; Let A = controller 1 knob value
OUT (HORCB),A ; Let horizontal color boundary = A
CALL UpdateDisp ; Call UpdateDisp subroutine
JP Loop ; Go back to beginning of infinite loop
Palettes: DB $F4,$1C,$1F,$5F ; Left color palette (11b, 10b, 01b, 00b)
DB $ED,$CD,$D5,$8E ; Right color palette (11b, 10b, 01b, 00b)
UpdateDisp: DI ; Disable interrupts
PUSH AF ; Push AF to SP
LD C,A ; Get first hex digit from knob value
SRL C ; ...
SRL C ; ...
SRL C ; ...
SRL C ; ...
LD B,0 ; Display first hex digit from knob value
LD HL,Hex ; ... Load HL with address Hex
ADD HL,BC ; ... Offset Hex by BC to get first hex digit
LD A,(HL) ; ... Load A with first hex digit
LD C,00000100b ; ... Load C with string options
LD D,40 ; ... Load D with string Y-coordinate
LD E,120 ; ... Load E with X-coordinate
SYSTEM (CHRDIS) ; ... Display first digit
POP AF ; Pop AF off SP
AND $0F ; Get second hex digit from knob value
LD C,A ; ...
LD B,0 ; Display second hex digit from knob value
LD HL,Hex ; ... Load HL with address Hex
ADD HL,BC ; ... Offset Hex by BC to get second hex digit
LD A,(HL) ; ... Load A with second hex digit
LD C,00000100b ; ... Load C with string options
LD D,40 ; ... Load D with Y-coordinate
LD E,128 ; ... Load E with X-coordinate
SYSTEM (CHRDIS) ; ... Display second digit
LD A,(FrameCount) ; Increment frame counter
INC A ; ...
LD (FrameCount),A ; ...
AND 00000111b ; Every fourth frame, run AnimBars
CP 00000100b ; ...
JR Z, AnimBars ; ...
JP AnimDone ; Otherwise, skip AnimBars
AnimBars: SYSSUK RANGED ; Load a random 8-bit number in A
DEFB 0 ; ...
LD BC,24*BYTEPL ; Load BC with one scanline's length
LD DE,NORMEM+(72*BYTEPL)
SYSTEM FILL ; Fill remainder of screen with repeating random tile
AnimDone: EI ; Enable interrupts
RET ; Return from subroutine
Hex: DB "0123456789ABCDEF"