P*------------------------------- * * Macro manager. * * This routine manages the macros. * DSK 'macman' REL VERSION = $A000 ;File type ID PUT 'playvars.i.s' PUT 'diskio.ext.s' CHROUT = $FFD2 GETIN = $FFE4 PLOT = $FFF0 MACBEGIN = $02 ;End of player/beginning of macros BFIELD1 = $04 ;Beginning of field 1 BFIELD2 = $06 ;Beginning of field 2 BFIELD3 = $08 ;Beginning of field 3 EFIELD3 = $0A ;End of field 3 ENDFIELD = $0A ;End of all fields TEMP = $FF POINT1 = $FD SCREENP = $FB CODETEXT = $61 ;Compiler text pointer CODEP = $63 ;Compiler code pointer ENTRYP EXT ;Entry point for macro SPEDEOF EXT SPEDBUFF EXT SPED EXT COMPILER EXT ERROR EXT INSTED EXT MUSICED EXT MUSINIT EXT INTINIT EXT PLAYFLAG EXT CLRGATE EXT FREBOT EXT FRETOP EXT CLIP EXT MACTEXT = LINKADDR-386 ;Table of names and addresses ;xx xx address ;14*xx name ;+2 bytes end of all macros *------------------------------- * * Initialize macro manager * MACINIT ENT * * RESETMAC -- Resets all macros and pointers * RESETMAC LDA #00 ;Erase all names STA POINT1 LDX #>MACTEXT LDY #LINKADDR BNE :L1 LDA #00 ;Reset all macro text LDY #23 :LOOP2 STA MACTEXT-24,Y DEY BPL :LOOP2 LDA #LINKADDR-2 STA POINT1+1 LDX #MACTEXT STA (POINT1),Y DEY TXA STA (POINT1),Y LDA POINT1 SEC SBC #16 STA POINT1 BCS :C1 DEC POINT1+1 :C1 DEX DEC CURMAC BPL :LOOP3 JSR SETTOP INC CURMAC ;CURMAC=0 RTS HILIGHT ;(Un)Hilight current selection LDX CURMAC LDY #9 JSR PLOPXY :LOOP LDA (SCREENP),Y EOR #$80 STA (SCREENP),Y INY CPY #23 BNE :LOOP RTS PNAMES LDA #155 JSR CHROUT LDA #147 JSR CHROUT LDA #15 STA COLOR LDA #23 STA TEMP :LOOP LDX TEMP ;First print out names etc. LDY #00 JSR PLOPXY TXA LDX #00 LDY #10 JSR PLOPNUM LDX TEMP LDY #3 JSR PLOPXY JSR GETINDEX LDA #'$' JSR CHAROUT LDY #01 LDA (POINT1),Y ;Address, hi byte JSR PHBYTE DEY LDA (POINT1),Y JSR PHBYTE ;Low byte LDA #32 JSR CHAROUT LDY #02 :LOOP2 LDA (POINT1),Y JSR CHAROUT INY CPY #16 ;14 chars per entry BNE :LOOP2 DEC TEMP ;Move on to next one BPL :LOOP RTS * Get table index of macro # contained in .X * and store in POINT1 GETINDEX LDA #00 STA POINT1+1 TXA ASL ;Get the table index ASL ASL ASL BCC :CONT INC POINT1+1 :CONT CLC ADC #MACTEXT STA POINT1+1 RTS SETTOP LDA MACTEXT ;Two bytes for file ID SEC SBC #3 STA FRETOP LDA MACTEXT+1 SBC #00 STA FRETOP+1 ;End of memory RTS * * Main manager * CURMAC DFB 00 MACMAN ENT LDA #12 STA $D020 LDA #6 STA $D021 JSR PNAMES LDA #14 ;Lower case JSR CHROUT JSR SETTOP :LOOP JSR HILIGHT :WAIT JSR GETIN BEQ :WAIT CMP #133 ;F1 BEQ :MUSIC CMP #134 BEQ :INST CMP #17 BEQ :DOWN CMP #29 BEQ :RIGHT CMP #145 BEQ :UP CMP #13 BEQ :EDIT CMP #'e' BEQ :EDIT CMP #147 BEQ :CLR CMP #136 ;F7 BEQ DISK CMP #'c' BEQ :COMP CMP #16 ;Ctrl-P BEQ :PLAY CMP #'d' BNE :WAIT :DEL JSR DELETE JMP MACMAN :CLR JSR CLEAR JMP MACMAN :MUSIC JMP MUSICED :INST JMP INSTED :DOWN JSR HILIGHT LDA CURMAC CMP #23 BEQ :LOOP INC CURMAC BNE :LOOP :UP JSR HILIGHT LDA CURMAC BEQ :LOOP DEC CURMAC BPL :LOOP :RIGHT JSR EDNAME JMP MACMAN :EDIT JSR EDMAC JMP MACMAN :COMP JSR COMPILE JMP MACMAN :PLAY LDA PLAYFLAG EOR #$FF STA PLAYFLAG BNE :PBLAH JSR CLRGATE JMP MACMAN :PBLAH JSR PLAYINIT JMP MACMAN DISK LDA FREBOT STA LOADADDR LDA FREBOT+1 STA LOADADDR+1 LDA MACTEXT SEC SBC #2 ;2 byte file ID STA SAVESTRT STA POINT1 LDA MACTEXT+1 SBC #00 STA SAVESTRT+1 STA POINT1+1 LDY #00 LDA #VERSION INY STA LOADID+1 STA (POINT1),Y LDA #$FF STA CLIP+1 ;Reset clipboard LDA #>LINKADDR STA SAVEEND+1 LDA #:TEXT JSR DISKIO LDA NEWDATA BNE :MOVE JMP MACMAN :MOVE LDA FREBOT STA BLSTART LDA FREBOT+1 STA BLSTART+1 LDA $AF ;EOF+1 STA BLEND+1 LDA $AE STA BLEND BNE :C1 DEC BLEND+1 :C1 DEC BLEND LDA BLEND SEC SBC BLSTART STA DIST LDA BLEND+1 SBC BLSTART+1 STA DIST+1 LDA #LINKADDR-1 SBC DIST+1 STA BLDEST+1 JSR BLMOVE ;Fix up macro addresses LDA #LINKADDR-2 STA POINT1+1 LDY #0 LDA (POINT1),Y STA CODEP ;Temp pointer INY LDA (POINT1),Y STA CODEP+1 ;CODEP = Old top of macros LDA #>MACTEXT STA (POINT1),Y LDA #