pinHeck A/V Kernel 3

From pinHeck Wiki
Jump to: navigation, search

The PIC32 runs main game code, the Parallax Propeller (Prop) handles audio/video. They do not share RAM, thus the Prop only knows what you tell it via A/V Control Commands.

pinHeck A/V Kernel 3 was created to support a 128x64 "double high" display using the same hardware and less video RAM than Kernel 2. The audio commands are the same for the most part but video works quite differently.

These are the commands you call from the main game kernel to control the Propeller A/V. Most commands do not return a value unless noted.

Video 128x64

videoPage(whichPage, which folder, clip0, clip1, which folder, clip0, clip1, priority, vectorPage, vidCommand)

videoPage(whichPage, which folder, clip0, clip1, priority, vectorPage, vidCommand)

videoControl(whichLayer, controlByte, frameTarget)



pinHeck system can play (4) channels of 22,050Hz stereo WAV files at the same time. The fourth channel (channel 3 logical numbers) is always used for music.

playSFX(which channel, which folder, clip0, clip1, priority)

playSFXQ(which channel, which folder, clip0, clip1, priority)

stereoSFX(which channel, which folder, clip0, clip1, priority, left volume, right volume)

playMusic(clip0, clip1)

playMusicOnce(clip0, clip1)


volumeSFX(which channel, volume left, volume right)

fadeMusic(fade speed, fade target)

repeatMusic(what state)

musicLoop(whichChannel, startingPoint, loopingPoint, jumpPoint)


pinHeck can play 1 video layer at 30 FPS, or combine 2 layers (with black as transparency) at 15 FPS. Both layers have forward/backward control, can advance 1-3 frames at a time, or you can manually jump to frames for a video mode.

Note that pinHeck audio/video is NOT interleaved (contained in same file) This is because quite often you'll have the same video with several different random audio calls attached to it.

video(which folder, clip0, clip1, attributes, progressBar, priority)

videoQ(which folder, clip0, clip1, attributes, progressBar, priority)


stopVideo(what state)

videoPriority(new priority)

videoControl(whichLayer, controlByte, xPos, yPos, frameTarget)

layerLoad(whichLayer, v1, v2, v3, vidAttributes, controlByte, xPos, yPos, vP, DMDsearch)

customScore(v1, v2, v3, vidAttributes)



Graphics are anything on the display that isn't part of the video. This includes numbers, progress bars, Ball and Credit indicators, and sprites (character set graphics you can move around)

numbers(which number, number Type, number X, number Y, number value)

numbersPriority(whichNumber, numType, numX, numY, numValue, matchPriority)



killTimer(which number)

characterSprite(which number, sprite attribute, sprite X, sprite Y, sprite height, sprite value)

showValue(number value, flash time, score flag)

showProgressBar(which Graphic, bar brightness, x pos, y pos, length of bar, height of bar)

value(xpos, ypos, the value)

text(xpos, ypos, the text string)

graphicsMode(do what, the modifier)

loadSprite(clip0, clip1, clip2, doLoad)



Again, the Propeller A/V processor has no clue what any scores are unless you tell it. Current player's score is always being changed, and all player scores / ball and credit numbers are updated at every drain cycle.

Update(attract mode state)

addScore(score amount)

setScore(which player)

manualScore(whichScore, whatValue)

EOBnumbers(whichNumber, number value)

sendHighScores(which score)

sendInitials(which player, which character)


The PIC32 uses the top half of the removable Propeller EEPROM for data storage. It has many more rewrite cycles than the flash memory contained inside the PIC32.

Because of this, EEPROM access is kind of slow (up to 20ms for a long write as it also verifies the write) It is best to only do it during drain cycles or between games.

writeEEPROM(which address, what value)

readEEPROM(which address)