mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-11-27 01:51:35 +00:00
89 lines
5.3 KiB
NASM
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"
|