;include file for stern assembler extensions (meteor) ;version 1.2 ;9-12-2016 v1.2 added word width parameters to functions 36 & 38 ; titled function 26 'dispatch' - reads switch matrix ;9.27.19 v1.3 added ifset and ifclear to lamp functions to make more intuitive instead of note and eq ;12.6.19 v1.3exp added lampon, lampoff more functionality to pigs functions, plus80 function for >10, ; added functions $5b loadbz $5c storebz for zeropage ;v2.0 revamped to use unified modifications to pigs ;changes: ; checklamp command is shortened to one byte, sets sign bit for all lamps <$80, mutually exclusive with 12 bit goto/gosub ; new command ; matchpattern checks up to 7 parameters via checklamp against last parameter which is correct bit pattern ; allows some to be set and some to be unset if needed ; storebmem/loadbmem have new opcodes for zeropage and page 2, saves 1 byte per command ; loadbmem now sets the Z flag appropriately, allowing a skip of bacomp $00 commands, saves 2 bytes per instance ; new command ; clearb equivalent of loadb $00, saves 1 byte per ; goto/gosub can support 12 bit addressing to save space, however this is mutually exclusive with shortened checklamp ; new commands ; skip, skip2, advances script one or 2 steps, used instead of short goto branches, saves 2 bytes per instance ; new commands ; lampon, lampoff string multiple lamps on/off together (uses same opcode), saves 1 byte per lamp ; lamponx all parameters 80s ; lampoffx all parameters 80s ; plus80 lamp parameters >9, all 80s ; end80 just parameters+80 except last one ; hiflagon set flag in reclaimed blink overflow area $32-$36 ; hiflagoff clear flag in reclaimed blink overflow area $32-$36 ; new command ; check_switch returns status of switch closed ; new command ; trip_switch setup a time delayed switch ; new command ; clear_switch clear switch from registers for debouncing, supports more (up to 9) and clearing time delay switches as well ; new aliases ; checkdip automatically assigns checklamp value based on dip # dip1=flag 68, dip 32=flag 87 ; checklamp tests for $3b/$3c boundry ; checkflag tests for $3b/$3c and $68-$c3 boundries ; checkblink automatically assigns checklamp value based on lamp [rarely used] lamp0=blink88, lamp $3b=blink $c3 ; flagbvalueon tests for $3b/$3c and $68-$c3 boundries ; flagbvalueoff tests for $3b/$3c and $68-$c3 boundries ;macros to help compiled code true avoiding as02.exe auto-optimization JUMP macro address db $7e dw address endm GOSUB macro address db $bd dw address endm STOREX macro address db $ff dw address endm LOADA macro address db $b6 dw address endm STOREA macro address db $b7 dw address endm LOADB macro address db $c6 dw address endm STOREB macro address db $f7 dw address endm ;alias macros checkdip macro fleh if fleh < 1 ERROR, OUTSIDE DIP RANGE LESS THAN 1 endif if fleh > 32 ERROR, OUTSIDE DIP RANGE GREATER THAN 32 endif checklampvalue fleh+$67 endm checklamp macro fleh if fleh >$3b ERROR, OUTSIDE LAMP RANGE endif checklampvalue fleh endm checkflag macro fleh if fleh <$3c ERROR, FLAG IS IN LAMP RANGE endif if ((fleh > $67) & (fleh < $88)) ERROR, FLAG IS IN DIP RANGE endif checklampvalue fleh endm checkblink macro fleh if fleh >$3b ERROR, OUTSIDE LAMP RANGE endif checklampvalue fleh+$88 endm flagbvalueon macro fleh if fleh <$3c ERROR, FLAG IS IN LAMP RANGE endif if ((fleh > $67) & (fleh <$88)) ERROR, FLAG IS IN DIP RANGE endif lampbvalueon fleh endm flagbvalueoff macro fleh if fleh <$3c ERROR, FLAG IS IN LAMP RANGE endif if ((fleh > $67) & (fleh <$88)) ERROR, FLAG IS IN DIP RANGE endif lampbvalueoff fleh endm ;custom macros per game if seawitch=1 clearb macro db $59 endm skip macro db $5a endm skip2 macro db $5b endm ;aliases for flagbvalue BUT also test for hiflag on/high flag off! flagon macro fleh if fleh > $80 db $5c,fleh else flagbvalueon fleh endif endm flagoff macro fleh if fleh > $80 db $5d,fleh else flagbvalueoff fleh endif endm matchpattern macro lamp ;minimum two parameters + pattern if \0=3 db $5e,\1,\2,\3+$80 endif if \0=4 db $5e,\1,\2,\3,\4+$80 endif if \0=5 db $5e,\1,\2,\3,\4,\5+$80 endif if \0=6 db $5e,\1,\2,\3,\4,\5,\6+$80 endif if \0=7 db $5e,\1,\2,\3,\4,\5,\6,\7+$80 endif if \0=8 db $5e,\1,\2,\3,\4,\5,\6,\7,\8+$80 endif endm endif ;seawitch ;stern macros enable_solenoid_00 macro timevalue db $00,timevalue endm enable_solenoid_01 macro timevalue db $01,timevalue endm enable_solenoid_02 macro timevalue db $02,timevalue endm enable_solenoid_03 macro timevalue db $03,timevalue endm enable_solenoid_04 macro timevalue db $04,timevalue endm enable_solenoid_05 macro timevalue db $05,timevalue endm enable_solenoid_06 macro timevalue db $06,timevalue endm enable_solenoid_07 macro timevalue db $07,timevalue endm enable_solenoid_08 macro timevalue db $08,timevalue endm enable_solenoid_09 macro timevalue db $09,timevalue endm enable_solenoid_0a macro timevalue db $0a,timevalue endm enable_solenoid_0b macro timevalue db $0b,timevalue endm enable_solenoid_0c macro timevalue db $0c,timevalue endm enable_solenoid_0d macro timevalue db $0d,timevalue endm enable_solenoid_0e macro timevalue db $0e,timevalue endm enable_solenoid_0f macro timevalue db $0f,timevalue endm cont_solenoid_on_7f macro db $10 endm cont_solenoid_on_flipper macro db $11 endm cont_solenoid_on_coin macro db $12 endm cont_solenoid_on_ef macro db $13 endm cont_solenoid_off_7f macro db $14 endm cont_solenoid_off_flipper macro db $15 endm cont_solenoid_off_coin macro db $16 endm cont_solenoid_off_ef macro db $17 endm rcflagset macro db $18 endm ila macro db $19 endm lampregbon macro db $1a endm lampbvalueon macro lampvalue db $1b,lampvalue endm lampregboff macro db $1c endm lampbvalueoff macro lampvalue db $1d,lampvalue endm altlampregb macro db $1e endm altlampbvalueon macro lampvalue db $1f,lampvalue endm checklampregbon macro db $20 endm if stern20=0 checklampvalue macro lampvalue db $21,lampvalue endm else checklampvalue macro lampvalue if lampvalue <$80 db lampvalue+$80 else db $21,lampvalue endif endm endif lampregbblinkon macro db $22 endm blinklampbvalueon macro lampvalue db $23,lampvalue endm clearplayflags macro db $24 endm delay macro delaytime db $25,delaytime endm dispatch macro db $26 endm goto macro labgoto db $27 dw labgoto endm notegoto macro labgoto db $28 dw labgoto endm ifsetgoto macro labgoto db $28 dw labgoto endm eqgoto macro labgoto db $29 dw labgoto endm ifcleargoto macro labgoto db $29 dw labgoto endm save_current_player macro db $2a endm restore_current_player macro db $2b endm gosub macro labgosub db $2c dw labgosub endm notegosub macro labgosub db $2d dw labgosub endm ifsetgosub macro labgosub db $2d dw labgosub endm eqgosub macro lagosub db $2e dw lagosub endm ifcleargosub macro lagosub db $2e dw lagosub endm return macro db $2f endm notereturn macro db $30 endm ifsetreturn macro db $30 endm eqreturn macro db $31 endm ifclearreturn macro db $31 endm tiltreturn macro db $32 endm gameoverreturn macro db $33 endm checkactivegame macro db $34 endm binc macro db $35 endm lxi macro locx,locx1 db $36,locx,locx1 endm lxiw macro locx db $36 dw locx endm bdec macro db $37 endm ixd macro locx1,locx2 db $38,locx1,locx2 endm ixdw macro locx db $38 dw locx endm loadb macro bvalue db $39,bvalue endm loadbmem macro locb ; if locb > $ff db $3a dw locb ; else ; db $5b ; db lo locb ; endif endm storebmem macro locb ; if locb > $ff db $3b dw locb ; else ; db $5c ; db lo locb ; endif endm bacomp macro aval db $3c,aval endm bxcomp macro xval db $3d dw xval endm aorb macro aval db $3e,aval endm aeorb macro aval db $3f,aval endm aandb macro aval db $40,aval endm func41 macro db $41 endm func42 macro db $42 endm push macro db $43 endm pop macro db $44 endm update_current_player macro db $45 endm blank_current_player macro db $46 endm show_current_player macro db $47 endm update_match macro db $48 endm show_ball_in_play macro db $49 endm show_credits macro db $4a endm show_hstd macro db $4b endm all_displays_valid macro db $4c endm all_displays_invalid macro db $4d endm xfer_scores_to_displays macro db $4e endm score macro scoreval db $4f,scoreval endm spawn_thread macro db $50 endm clear_var macro db $51 endm bcdinc macro width,location db $52,width ; dw location+width+1 dw location endm bcddec macro width,location db $53,width ; dw location+width+1 dw location endm reboot macro db $54 endm xloadgoto macro labgoto ;really xloadgosub db $55 dw labgoto endm xloadgosub macro lagosub db $55 dw lagosub endm addtoscoreq macro scoreval db $56,scoreval endm sound_play_primary macro location db $57 dw location endm sound_play_secondary macro location db $58 dw location endm if speech=1 sound_play_speech macro location db $59 dw location endm ;shortened speech command speech macro location db $59 dw location endm endif ;speech option ;experimental pigs ;lamp on - bit7 set=more operands - last ends with clear ;automatically adds $80 to starting lamps in command string ;maximum 10 lamps but this is AS02.exe limitation - pinbol can support unlimited lampon macro lamp ;minimum one lamp, max same as lampon if \0=1 db $1b,\1 endif if \0=2 db $1b,\1+$80,\2 endif if \0=3 db $1b,\1+$80,\2+$80,\3 endif if \0=4 db $1b,\1+$80,\2+$80,\3+$80,\4 endif if \0=5 db $1b,\1+$80,\2+$80,\3+$80,\4+$80,\5 endif if \0=6 db $1b,\1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6 endif if \0=7 db $1b,\1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80,\7 endif if \0=8 db $1b,\1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80,\7+$80,\8 endif if \0=9 db $1b,\1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80,\7+$80,\8+$80,\9 endif endm lampoff macro lamp ;minimum one lamp, max same as lampon if \0=1 db $1d,\1 endif if \0=2 db $1d,\1+$80,\2 endif if \0=3 db $1d,\1+$80,\2+$80,\3 endif if \0=4 db $1d,\1+$80,\2+$80,\3+$80,\4 endif if \0=5 db $1d,\1+$80,\2+$80,\3+$80,\4+$80,\5 endif if \0=6 db $1d,\1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6 endif if \0=7 db $1d,\1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80,\7 endif if \0=8 db $1d,\1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80,\7+$80,\8 endif if \0=9 db $1d,\1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80,\7+$80,\8+$80,\9 endif endm plus80 macro lamp ;just a string of up to 9 digits with the 80 added in if \0=1 db \1+$80 endif if \0=2 db \1+$80,\2+$80 endif if \0=3 db \1+$80,\2+$80,\3+$80 endif if \0=4 db \1+$80,\2+$80,\3+$80,\4+$80 endif if \0=5 db \1+$80,\2+$80,\3+$80,\4+$80,\5+$80 endif if \0=6 db \1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80 endif if \0=7 db \1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80,\7+$80 endif if \0=8 db \1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80,\7+$80,\8+$80 endif if \0=9 db \1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80,\7+$80,\8+$80,\9+$80 endif endm lamponx macro lamp ;minimum one lamp, max same as lampon, ends with +$80 for >9 lamps if \0=1 db $1b,\1+$80 endif if \0=2 db $1b,\1+$80,\2+$80 endif if \0=3 db $1b,\1+$80,\2+$80,\3+$80 endif if \0=4 db $1b,\1+$80,\2+$80,\3+$80,\4+$80 endif if \0=5 db $1b,\1+$80,\2+$80,\3+$80,\4+$80,\5+$80 endif if \0=6 db $1b,\1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80 endif if \0=7 db $1b,\1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80,\7+$80 endif if \0=8 db $1b,\1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80,\7+$80,\8+$80 endif if \0=9 db $1b,\1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80,\7+$80,\8+$80,\9+$80 endif endm lampoffx macro lamp ;minimum one lamp, max same as lampon if \0=1 db $1d,\1+$80 endif if \0=2 db $1d,\1+$80,\2+$80 endif if \0=3 db $1d,\1+$80,\2+$80,\3+$80 endif if \0=4 db $1d,\1+$80,\2+$80,\3+$80,\4+$80 endif if \0=5 db $1d,\1+$80,\2+$80,\3+$80,\4+$80,\5+$80 endif if \0=6 db $1d,\1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80 endif if \0=7 db $1d,\1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80,\7+$80 endif if \0=8 db $1d,\1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80,\7+$80,\8+$80 endif if \0=9 db $1d,\1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80,\7+$80,\8+$80,\9+$80 endif endm end80 macro lamp ;just a string of up to 9 digits with the 80 added in, except end lamp is plain if \0=1 db \1 endif if \0=2 db \1+$80,\2 endif if \0=3 db \1+$80,\2+$80,\3 endif if \0=4 db \1+$80,\2+$80,\3+$80,\4 endif if \0=5 db \1+$80,\2+$80,\3+$80,\4+$80,\5 endif if \0=6 db \1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6 endif if \0=7 db \1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80,\7 endif if \0=8 db \1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80,\7+$80,\8 endif if \0=9 db \1+$80,\2+$80,\3+$80,\4+$80,\5+$80,\6+$80,\7+$80,\8+$80,\9 endif endm if seawitch=0 ;aliases for flagbvalue BUT also test for hiflag on/high flag off! flagon macro fleh flagbvalueon fleh endm flagoff macro fleh flagbvalueoff fleh endm endif ;regular non seawitch check_switch macro switch if switch > $40 ERROR endif db $24,switch endm trip_switch macro switch,time if switch < $28 ERROR endif if switch > $37 ERROR endif if time > $ff ERROR endif if switch=$28 timer=$5b endif if switch=$29 timer=$5a endif if switch=$2a timer=$59 endif if switch=$2b timer=$58 endif if switch=$2c timer=$57 endif if switch=$2d timer=$56 endif if switch=$2e timer=$55 endif if switch=$2f timer=$54 endif if switch=$30 timer=$63 endif if switch=$31 timer=$62 endif if switch=$32 timer=$61 endif if switch=$33 timer=$60 endif if switch=$34 timer=$5f endif if switch=$35 timer=$5e endif if switch=$36 timer=$5d endif if switch=$37 timer=$5c endif db $5c,time,timer endm