Listing of file='MENU.MAC;09' 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 12 ;NUMBER OF BLOCKS WIDTH: DB 3 ;WIDTH OF A BLOCK (IN CHRS) HEIGHT: DB 3 ;HEIGHT ; ; COMPOSITE COLOR CODES AND ; X-Y ADDRESS OF TOP-LEFT CORNER FOR EACH BLOCK ; ADDRS: DB 8,10,4 DB 16,10,9 DB 32,10,14 DB 24,10,19 DB 48,10,24 DB 40,10,29 DB 8,40,4 DB 16,40,9 DB 32,40,14 DB 24,40,19 DB 48,40,24 DB 40,40,29 DS 24 ;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 MVI A,' ' STA 7FFEH RET FOUND: POP PSW ;CALCULATE BLOCK NUMBER MOV B,A LDA NOBLKS SUB B ADI 1 MOV E,A ;RETURN IN DE ADI '0' STA 7FFEH ;INDICATE ON SCREEN 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