LST OFF * * PCS DISK I/O AND KEYBOARD * HANDLERS * ORG $9500 OBJ $8000 * PARAM EQU $00 TEMP EQU $07 XTEMP EQU TEMP+1 YTEMP EQU XTEMP+1 TEMP2 EQU YTEMP+1 * BASE1 EQU $10 BASE2 EQU BASE1+2 * * USER INTERFACE * CURSOR EQU $80 CURSORY EQU CURSOR+2 CURSORXDIV7 EQU CURSORY+1 CURSORXMOD7 EQU CURSORXDIV7+1 CURSORHEIGHT EQU CURSORXMOD7+1 CURSORWIDTH EQU CURSORHEIGHT+1 CRSRXACC EQU CURSORWIDTH+1 CRSRYACC EQU CRSRXACC+1 NEWCURSORXDIV7 EQU CRSRYACC+1 NEWCURSORXMOD7 EQU NEWCURSORXDIV7+1 NEWCURSORY EQU NEWCURSORXMOD7+1 CRSRRTSTOP EQU NEWCURSORY+1 NEWITEM EQU CRSRRTSTOP+1 LASTITEM EQU NEWITEM+2 * * DATA STRUCTURE * OBJ EQU LASTITEM+2 NEXTOBJ EQU OBJ+2 OBJCOUNT EQU NEXTOBJ+1 PLYPTRX EQU OBJCOUNT+1 PLYPTRY EQU PLYPTRX+2 OBJID EQU PLYPTRY+2 FILLCOLOR EQU OBJID+1 VRTXCOUNT EQU FILLCOLOR+1 LBASE EQU VRTXCOUNT+1 SCANMODE EQU LBASE+2 MEMBTM EQU SCANMODE+1 MIDBTM EQU MEMBTM+2 MIDTOP EQU MIDBTM+2 MIDY EQU MIDTOP+2 * CHARINDX EQU MIDY+1 CHARASCII EQU CHARINDX+1 BOXCURSORON EQU CHARASCII+1 DTIMER1 EQU BOXCURSORON+1 DTIMER2 EQU DTIMER1+1 DRIVE EQU DTIMER2+1 SLOT EQU DRIVE+1 DISKCMD EQU SLOT+1 STACKTEMP EQU DISKCMD+1 * GAMEBTM EQU $177D GAMESTART EQU $8554 PLAYGAME EQU GAMESTART+32 GAMETOP EQU $8F00 * CHARBUF EQU $1F00 LINELEN EQU $1F1E HIRES1 EQU $2000 HTOP EQU $4000 FMWB EQU $400 TSBUF EQU $500 DSBUF EQU $600 SWAPUSER EQU $1E18 RELOAD EQU $1E1C ERRMSGS EQU $A971 ERRTBL EQU $AA3F FMGR EQU $AAFD FMPL EQU $B5BB * * PBDB * PBBASE EQU $4000 LOGIC EQU PBBASE WSET EQU LOGIC+24 PBDATA EQU WSET+4 OBJDX EQU PBDATA+1 PBDX EQU $6F40 * * EXTERNALS * DIV7 EQU $1400 MOD7 EQU DIV7+$100 LO EQU MOD7+$100 HI EQU LO+$C0 SETMODE EQU HI+$10F DRAWBITS EQU SETMODE+$25 XOFFDRAW EQU DRAWBITS+$3D GETRECT EQU XOFFDRAW+$59 MASKS EQU GETRECT+$41 HLINE EQU MASKS+$F VLINE EQU HLINE+$20 FRAMERECT EQU VLINE+$58 DRAWRECT EQU FRAMERECT+$28 INRECT EQU DRAWRECT+$10 GETBUTNS EQU INRECT+$2D INITCRSR EQU GETBUTNS+$7 XDRAWCRSR EQU INITCRSR+$1B UPDATECRSR EQU XDRAWCRSR+$7 DOCRSRX EQU UPDATECRSR+$1E GETCURSORX EQU DOCRSRX+$45 DOCRSRY EQU GETCURSORX+$16 JSCTRL EQU DOCRSRY+$4D CRSRINRECT EQU JSCTRL+$21 DOMENU EQU CRSRINRECT+$13 SELECT EQU DOMENU+$54 INIT EQU SELECT+$40 MOVEUP EQU INIT+$35 MOVEDOWN EQU MOVEUP+$3B ADDIYX EQU MOVEDOWN+$39 ADDYX EQU ADDIYX+$E SUBIYX EQU ADDYX+$10 SUBYX EQU SUBIYX+$12 CMPYX EQU SUBYX+$10 CHARTO EQU CMPYX+$F PRCHAR EQU CHARTO+$A PRINT EQU PRCHAR+$38 CHAR EQU PRINT+$19 * * PPAK * DRAWDISPLAY EQU $8E20 GETOBJ EQU DRAWDISPLAY+$3E GETNEXTOBJ EQU GETOBJ+$C GETINFO EQU GETNEXTOBJ+$1B DRAWOBJ EQU GETINFO+$3E SETCOLOR EQU DRAWOBJ+$14 SCANPOLY EQU SETCOLOR+$25 ALIGNPOLY EQU SCANPOLY+$404 GETSCAN EQU ALIGNPOLY+$39 MAKEHOLE EQU GETSCAN+$57 SELECTPOLY EQU MAKEHOLE+$4A POLYPOINTS EQU SELECTPOLY+$33 REMOVEPOLY EQU POLYPOINTS+$37 GETBOUNDS EQU REMOVEPOLY+$6E * TSX STX STACKTEMP START LDY #0 LDA #$4D SETUP2 STY XTEMP STA CHAR+2 LDA #$18 STA CHAR+3 LDA #0 STA CHAR+4 LDA TXTLO,Y LDX TXTHI,Y JSR PRINT LDA CHAR+2 CLC ADC #10 LDY XTEMP CPY #2 BEQ SKIP CPY #4 BNE NOSKIP SKIP ADC #10 NOSKIP INY CPY #7 BNE SETUP2 * LDA #$4D SETUP3 STY XTEMP STA CHAR+2 LDA #$20 STA CHAR+3 LDA #0 STA CHAR+4 LDA TXTLO,Y LDX TXTHI,Y JSR PRINT LDA CHAR+2 CLC ADC #10 LDY XTEMP INY CPY #11 BNE *+4 ADC #10 CPY #13 BNE SETUP3 * LDA #HAND JSR INITCRSR * LDA #1 STA DRIVE JSR HLDRIVE LDA #6 STA SLOT JSR HLSLOT * MAIN JSR JSCTRL JSR UPDATECRSR LDA $C061 BPL MAIN * MAIN2 LDA #SLOTB JSR CRSRINRECT BCC MAIN3 * LDA SLOT JSR HLSLOT LDA #0 STA LASTITEM+1 LDA #SLOTMENU JSR DOMENU BEQ SSLOT3 SSLOT2 LDA SLOT JSR HLSLOT JMP MAIN SSLOT3 LDA #6 STA SLOT BNE SSLOT2 * SLOTMENU DA SBOX1 DA SETSLOT DA SBOX2 DA SETSLOT DA SBOX3 DA SETSLOT DA SBOX4 DA SETSLOT HEX 00 * SETSLOT LDA YTEMP CLC ADC #18 LSR LSR STA SLOT RTS * MAIN3 LDA #DRIVEB JSR CRSRINRECT BCC MAIN4 * LDA DRIVE JSR HLDRIVE LDA #0 STA LASTITEM+1 LDA #DRIVEMENU JSR DOMENU BEQ SDRIV3 SDRIV2 LDA DRIVE JSR HLDRIVE JMP MAIN SDRIV3 LDA #1 STA DRIVE BNE SDRIV2 * DRIVEMENU DA DBOX1 DA SETDRIVE DA DBOX2 DA SETDRIVE HEX 00 * SETDRIVE LDA YTEMP CLC ADC #6 LSR LSR STA DRIVE RTS * HLSLOT TAY LDA SLVERT-4,Y STA SLOTBOX LDA #SLOTBOX JMP DRAWRECT * SLVERT HEX 4B555F69 * HLDRIVE TAY LDA DRVERT-1,Y STA DRIVEBOX LDA #DRIVEBOX JMP DRAWRECT * DRVERT HEX 7E88 * MAIN4 LDA #MENUBOX JSR CRSRINRECT BCC MAIN5 * LDA #0 STA LASTITEM+1 LDA #DISKMENU JSR DOMENU MAIN5 JMP MAIN * HAND DA *+7 HEX 0000000C02 HEX 030006000C00180C HEX 34067C067E077E07 HEX 7C0B780D70060003 * DISKMENU DA LOADBOX DA LOAD DA SAVEBOX DA SAVE DA QUITBOX DA QUIT DA MAKEBOX DA MAKE DA PLAYBOX DA PLAY HEX 00 * TXTLO DA LOADMSG DA >SAVEMSG DA >QUITMSG DA >MAKEMSG DA >GAMEMSG DA >PLAYMSG DA >GAMEMSG DA >SL4MSG DA >SL5MSG DA >SL6MSG DA >SL7MSG DA >DR1MSG DA >DR2MSG * LOADMSG HEX 15180A8D SAVEMSG HEX 1C0A1F8E QUITMSG HEX 1A1E129D MAKEMSG HEX 160A148E PLAYMSG HEX 19150AA2 GAMEMSG HEX 100A168E INSERTMSG HEX 12171C0E1B1D2422181E1B24100A160E240D121C14 HEX 240A170D2411121D240A24140EA2 * SL4MSG HEX 1C15181D84 SL5MSG HEX 1C15181D85 SL6MSG HEX 1C15181D86 SL7MSG HEX 1C15181D87 * DR1MSG HEX 0D1B121F0E81 DR2MSG HEX 0D1B121F0E82 * MENUBOX HEX 4017006F0F06 LOADBOX HEX 4B17040A0400 SAVEBOX HEX 5517040A0400 QUITBOX HEX 5F17040A0400 MAKEBOX HEX 731704140402 PLAYBOX HEX 931704140402 * SLOTB HEX 401F00340706 SLOTBOX HEX 001F040A0503 SBOX1 HEX 4B1F040A0503 SBOX2 HEX 551F040A0503 SBOX3 HEX 5F1F040A0503 SBOX4 HEX 691F040A0503 * DRIVEB HEX 7E1F00140706 DRIVEBOX HEX 001F040A0505 DBOX1 HEX 7E1F040A0505 DBOX2 HEX 881F040A0505 * LOAD JSR GETNAME JSR INPROMPT1 LDA #0 STA DISKCMD * LDX #1 JSR OPEN * LDA #3 STA FMPL LDA #4 STA FMPL+1 JSR ZPOSN LDA #4 STA FMPL+6 LDA #0 STA FMPL+7 LDA #PBBASE-4 STA FMPL+9 JSR DOFCMD * LDA #2 STA FMPL+1 LDA PBBASE-2 STA FMPL+6 LDA PBBASE-1 STA FMPL+7 LDA #PBBASE STA FMPL+9 JSR DOFCMD * JSR CLOSE * JSR INIT LDY PBDATA JSR GETOBJ JSR DECOMPRESS LDA #0 STA SCANMODE JSR DRAWDISPLAY JMP START * SAVE JSR GETNAME JSR INPROMPT1 LDA #1 STA DISKCMD LDA #$80 STA SCANMODE JSR DRAWDISPLAY JSR COMPRESS * LDA #PBBASE STA PARAM+1 LDA MIDBTM SEC SBC #PBBASE STA PARAM+3 * JSR BSAVE * LDA #0 STA SCANMODE JSR DRAWDISPLAY JMP START * BSAVE LDX #0 JSR OPEN * LDA #4 STA FMPL STA FMPL+1 JSR ZPOSN * LDA PARAM SEC SBC #4 STA FMPL+8 STA TEMP LDA PARAM+1 SBC #0 STA FMPL+9 STA TEMP+1 LDA PARAM+2 CLC ADC #3 ;LESS 1 STA FMPL+6 LDA PARAM+3 ADC #0 STA FMPL+7 * LDY #0 LDA PARAM STA (TEMP),Y INY LDA PARAM+1 STA (TEMP),Y INY LDA PARAM+2 STA (TEMP),Y INY LDA PARAM+3 STA (TEMP),Y * JSR DOFCMD JMP CLOSE * ZPOSN LDA #0 STA FMPL+2 STA FMPL+3 STA FMPL+4 STA FMPL+5 RTS * CLOSE LDA #2 STA FMPL LDX #1 JMP DOFCMD * OPEN LDA #1 ;OPEN STA FMPL JSR ZPOSN * LDA DRIVE STA FMPL+5 LDA SLOT STA FMPL+6 * LDA #4 ;BINARY FILE STA FMPL+7 LDA #CHARBUF STA FMPL+9 BNE DOFCMD2 * DOFCMD LDX #1 DOFCMD2 LDA #FMWB STA FMPL+13 LDA #TSBUF STA FMPL+15 LDA #DSBUF STA FMPL+17 JSR FMGR BCS ERROR RTS * ERROR LDA DISKCMD CMP #1 BNE ERR2 STA SCANMODE JSR DRAWDISPLAY * ERR2 JSR DODIALOG LDY #$59 LDX #1 LDA #0 JSR CHARTO LDY FMPL+10 LDX ERRTBL,Y ERR4 LDA ERRMSGS,X STX XTEMP AND #$7F CMP #$20 BNE ERR5 LDA CHAR+4 CLC ADC #4 CMP #7 BCC *+7 SBC #7 INC CHAR+3 STA CHAR+4 JMP ERR6 ERR5 CMP #$41 BCC ERR6 CMP #$5B BCS ERR6 SBC #$36 JSR PRCHAR ERR6 LDX XTEMP LDA ERRMSGS,X BMI ERR7 INX BNE ERR4 * ERR7 LDA $C000 BPL ERR7 STA $C010 * JSR UNDODIALOG LDA DISKCMD CMP #2 BEQ MAKEOUT JMP START * QUIT LDX STACKTEMP TXS RTS * MAKE JSR GETNAME LDY CHARINDX LDA #$A0 STA CHARBUF,Y STA CHARBUF+1,Y STA CHARBUF+2,Y * LDA #2 STA DISKCMD JSR CLEARMENU LDY #191 JSR MAKEHOLE JSR SWAPUSER JSR INPROMPT1 * LDA #$4C ;JMP OP STA GAMEBTM LDA #GAMESTART STA GAMEBTM+2 * LDA #GAMEBTM STA PARAM+1 LDA #GAMETOP SBC #>GAMEBTM STA PARAM+3 * JSR BSAVE * MAKEOUT LDA #GAMEBTM-4 STA TEMP+1 LDA #$3F ;PATCH TABLE LDY #6 MAK2 STA (TEMP),Y SEC SBC #4 DEY BPL MAK2 * QUITMAKE LDA STACKTEMP JMP RELOAD * PLAY JSR CLEARMENU LDY #191 JSR MAKEHOLE JSR SWAPUSER JSR PLAYGAME JMP QUITMAKE * INPROMPT1 JSR DODIALOG LDY #$59 LDX #1 LDA #0 JSR CHARTO LDA #INSERTMSG JSR PRINT * STA $C010 WAIT1 LDA $C000 BPL WAIT1 STA $C010 JMP UNDODIALOG * CLEARMENU JSR XDRAWCRSR LDY #3 JSR SETMODE LDA #MENUBOX JSR DRAWRECT LDY #2 JMP SETMODE * DODIALOG LDY #1 JSR SETMODE LDA #DIALOGBITS JSR DRAWBITS LDY #3 JSR SETMODE LDA #DIALOGBOX JSR DRAWRECT LDY #2 JSR SETMODE JMP FRAMERECT+3 * UNDODIALOG LDY #0 JSR SETMODE LDA #DIALOGBITS JSR DRAWBITS LDY #0 TYA UNDODLG2 STA $400,Y STA $500,Y STA $600,Y INY BNE UNDODLG2 LDY #2 JMP SETMODE * GETNAME JSR CLEARMENU JSR DODIALOG LDY #29 LDA #$A0 GETN2 STA CHARBUF,Y DEY BPL GETN2 * LDY #$59 LDX #$01 LDA #0 STX BOXCURSOR+3 STA BOXCURSOR+4 STA BOXCURSORON STA CHARINDX JSR CHARTO * GETN3 JSR CHECKCURSOR LDA $C000 BPL GETN3 STA $C010 STA CHARASCII CMP #$9B BEQ GETN4 CMP #$8D BEQ GETN5 ;C=1 JSR CURSOROFF LDA CHARASCII JSR DOKBD JSR CURSOROFF JMP GETN3 * GETN4 CLC GETN5 PHP JSR CURSOROFF * JSR UNDODIALOG LDY CHARINDX LDA #$AE STA CHARBUF,Y LDA #$D0 STA CHARBUF+1,Y LDA #$C2 STA CHARBUF+2,Y PLP BCS GETN6 LDX STACKTEMP TXS JMP START GETN6 RTS * DIALOGBITS DA $A000 HEX 5700000B28 * DIALOGBOX HEX 5700000A2705 * DOKBD LDY CHARINDX CMP #$88 BEQ DOKB7 * CPY #27 BCS DOKB5 * CMP #$A0 BNE DOKB2 * STA CHARBUF,Y LDA CHAR+3 STA LINELEN,Y TAX LDA CHAR+4 STA LINELEN+27,Y CLC ADC #4 CMP #7 BCC *+5 SBC #7 INX STX CHAR+3 STX BOXCURSOR+3 STA CHAR+4 STA BOXCURSOR+4 JMP DOKB4 * DOKB2 CMP #$B0 BCC DOKB5 CMP #$BA BCS DOKB6 SBC #$AF ;C=0, -B0 * DOKB3 TAX LDA CHARASCII STA CHARBUF,Y LDA CHAR+3 STA LINELEN,Y LDA CHAR+4 STA LINELEN+27,Y TXA JSR PRCHAR LDA CHAR+3 STA BOXCURSOR+3 LDA CHAR+4 STA BOXCURSOR+4 DOKB4 INC CHARINDX DOKB5 RTS * DOKB6 CMP #$C1 BCC DOKB5 CMP #$DB BCS DOKB5 SBC #$B6 ;C=0 -B7 BNE DOKB3 * DOKB7 DEY BMI DOKB5 STY CHARINDX LDA LINELEN,Y STA CHAR+3 STA CLRRECT+1 STA BOXCURSOR+3 LDA LINELEN+27,Y STA CHAR+4 STA CLRRECT+2 STA BOXCURSOR+4 LDA #$A0 STA CHARBUF,Y LDY #3 JSR SETMODE LDA #CLRRECT JSR DRAWRECT LDY #2 JMP SETMODE * CLRRECT HEX 590000070006 * CURSOROFF LDA BOXCURSORON BNE DOCURSOR RTS * CHECKCURSOR INC DTIMER1 BNE DOCR2 INC DTIMER2 LDA DTIMER2 AND #$1F BNE DOCR2 LDA BOXCURSORON EOR #$FF STA BOXCURSORON * DOCURSOR LDA #BOXCURSOR JMP XOFFDRAW * DOCR2 RTS * BOXCURSOR DA *+7 HEX 5900000701 HEX 3F3F3F3F3F3F3F * COMPRESS LDA #HIRES1 STA BASE1+1 LDA HTOP PHA LDA #$FF STA HTOP-1 STA HTOP * FINDZ LDY #0 FINDZ2 LDA (BASE1),Y BNE FINDZ3 INY BNE FINDZ2 * LDA #1 STA (MIDBTM),Y TYA INY STA (MIDBTM),Y ;1/256 RECORD * INC BASE1+1 ;BASE+256 LDA MIDBTM ;MIDBTM+2 CLC ADC #2 STA MIDBTM BCC *+4 INC MIDBTM+1 JMP FINDZ * FINDZ3 LDA BASE1+1 CMP #>HTOP BCS FINDZ4 CPY #2 BCC FINDNZ FINDZ4 STY TEMP LDA #1 LDY #0 STA (MIDBTM),Y INY LDA TEMP STA (MIDBTM),Y ;1/RUNLEN REC * CLC ADC BASE1 ;BASE+RUNLEN STA BASE1 BCC *+4 INC BASE1+1 LDA MIDBTM ;MIDBTM+2 CLC ADC #2 STA MIDBTM BCC *+4 INC MIDBTM+1 * LDA BASE1+1 CMP #>HTOP BCC FINDZ LDY #0 LDA #1 STA (MIDBTM),Y INY STA (MIDBTM),Y ;1/1 REC * LDA MIDBTM CLC ADC #2 STA MIDBTM BCC *+4 INC MIDBTM+1 * PLA STA HTOP RTS * FINDNZ INY FINDNZ2 LDA (BASE1),Y BEQ FINDNZ5 INY BNE FINDNZ2 * FINDNZ3 TYA STA (MIDBTM),Y INC MIDBTM BNE *+4 INC MIDBTM+1 * FINDNZ4 LDA (BASE1),Y STA (MIDBTM),Y INY BNE FINDNZ4 ;256/BYTES REC * INC BASE1+1 INC MIDBTM+1 JMP FINDZ * FINDNZ5 INY BEQ FINDNZ3 LDA (BASE1),Y BNE FINDNZ2 STY TEMP TYA LDY #0 STA (MIDBTM),Y INC MIDBTM BNE *+4 INC MIDBTM+1 * FINDNZ6 LDA (BASE1),Y STA (MIDBTM),Y INY BNE FINDNZ6 ;RUN LEN/BYTES REC * LDA TEMP CLC ADC BASE1 STA BASE1 BCC *+4 INC BASE1+1 LDA TEMP CLC ADC MIDBTM STA MIDBTM BCC *+4 INC MIDBTM+1 JMP FINDZ * DECOMPRESS LDA #HIRES1 STA BASE1+1 LDA HTOP PHA * DCMP2 LDY #0 LDA (OBJ),Y CMP #1 BNE DCMP6 * INY LDA (OBJ),Y CMP #1 BEQ DCMP5 STA TEMP TAY DEY * LDA #0 DCMP3 STA (BASE1),Y DEY BNE DCMP3 STA (BASE1),Y * LDA TEMP BEQ DCMP4 CLC ADC BASE1 STA BASE1 BCC *+4 DCMP4 INC BASE1+1 LDA OBJ CLC ADC #2 STA OBJ BCC *+4 INC OBJ+1 JMP DCMP2 * DCMP5 PLA STA HTOP RTS * DCMP6 STA TEMP INC OBJ BNE *+4 INC OBJ+1 TAY DEY * DCMP7 LDA (OBJ),Y STA (BASE1),Y DEY BNE DCMP7 LDA (OBJ),Y STA (BASE1),Y * LDA TEMP BEQ DCMP8 CLC ADC BASE1 STA BASE1 BCC *+4 DCMP8 INC BASE1+1 LDA TEMP BEQ DCMP9 CLC ADC OBJ STA OBJ BCC *+4 DCMP9 INC OBJ+1 JMP DCMP2