Listing of file='MENU.MAC;0A' on disk='vmedia/sound_light_pen-sector.ccvf'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; MENU PROGRAM FOR USE WITH LIGHT PEN ; ; VALUES ON ENTRY ARE IRRELEVANT ; ; RETURNS: ; DE = BLOCK NUMBER IN THE LIST ; (THE BLOCKS ARE NUMBERED STARTING AT ONE ; AT THE BEGINNING OF THE LIST.) ; A ZERO INDICATES THAT THE PEN WAS NOT ; POINTED AT ONE OF THE BLOCKS. ; ; NOTE: DE IS USED FOR COMPATIBILITY WITH BASIC ; ; ; DESTROYS ALL REGISTERS ; ; ; THE ROUTINE IS TABLE DRIVEN, WITH THE DATA FOR THE ; MENU BLOCKS CONTAINED IN THE FOLLOWING PUBLIC TABLE. ; ALL BLOCKS ARE THE SAME SIZE AND SHAPE, AND THEIR ; POSITION IS SPECIFIED BY THEIR X-Y COORDS. IT IS NOT ; NECESSARY THAT THE COORDS BE IN ANY ORDER. ; PUBLIC BLKTAB BLKTAB: NOBLKS: DB 14 ;NUMBER OF BLOCKS WIDTH: DB 2 ;WIDTH OF A BLOCK (IN CHRS) HEIGHT: DB 2 ;HEIGHT ; ; COMPOSITE COLOR CODES AND ; X-Y ADDRESS OF TOP-LEFT CORNER FOR EACH BLOCK ; ADDRS: DB 8,5,4 DB 16,5,8 DB 32,5,12 DB 24,5,16 DB 48,5,20 DB 40,5,24 DB 56,5,28 DB 8,35,4 DB 16,35,8 DB 32,35,12 DB 24,35,16 DB 48,35,20 DB 40,35,24 DB 56,35,28 DS 18 ;EXTRA SPACE FOR UP TO 20 BLOCKS EXTRN BLOCK,LPTEST,SPULSE ENTRY MENU MENU: LDA NOBLKS LXI H,ADDRS MENU10: PUSH PSW MVI D,' ' ;SET FILL CHR AS SPACE MOV E,M ;GET CCI INX H CALL NEWBLK ;DRAW NEXT BLOCK POP PSW DCR A ;ANY MORE ? JNZ MENU10 ;YES CALL SPULSE ;NO, WAIT FOR TRIGGER CALL LPTEST ;TEST PEN OUTPUT MOV A,E ORA D ;LIGHT DETECTED ? JZ BAD ;NO LDA NOBLKS ;YES, SCAN BLOCKS LXI H,ADDRS MENU20: PUSH PSW MVI D,' ' XRA A MOV E,A ;SET COLOR TO BLACK ON BLACK INX H CALL NEWBLK CALL LPTEST ;CHECK PEN MOV A,E ORA D ;NO LIGHT ? PUSH PSW ;SAVE RESULT OF TEST DCX H ;BACKUP IN LIST DCX H DCX H MVI D,' ' MOV E,M INX H CALL NEWBLK ;REDRAW THE BLOCK POP PSW ;GET PEN STATUS BACK - LIGHT PRESENT ? JZ FOUND ;NO - GOT IT! POP PSW ;YES DCR A ;ANOTHER BLOCK ? JNZ MENU20 ;YES BAD: XRA A ;NO - ALL DONE AND NOT FOUND MOV D,A ;RETURN ZERO MOV E,A MOV B,A RET FOUND: POP PSW ;CALCULATE BLOCK NUMBER MOV B,A LDA NOBLKS SUB B ADI 1 MOV E,A ;RETURN IN DE XRA A MOV D,A MOV B,A RET ; ; DRAW A BLOCK ACCORDING TO PARAMETERS IN MEMORY ; ENTRY NEWBLK NEWBLK: MOV B,M ;GET BLOCK PARAMETERS INX H MOV C,M INX H PUSH H ;SAVE POINTER TO PARAMETERS LDA WIDTH MOV H,A LDA HEIGHT MOV L,A CALL BLOCK ;DRAW THE BLOCK POP H ;RESTORE PARAMETER POINTER RET END MENU