; ; S:SUBPAK3 ; ; PRINT routine ; PRDONE = 0 PRNORM = 1 PRINVR = 2 PRLEFT = 3 PRRITE = 4 PRCNTR = 5 PRLOC = 6 PRSMAL = 7 PRBIG = 8 PRSTR = 9 PRSPC = 10 PRHTAB = 11 PRVTAB = 12 CR = 13 NOCR = 14 RTOSBLAK = 15 RTOSWITE = 16 RTOSANY = 17 PRCSPACE = 18 PRPIC = 19 PRRTAB = 20 PRRTAB2 = 21 PRKERN = 22 RTOSINV = 23 GOOBER = 24 ; PRINT JSR GETINIT JSR PRZZNORM JSR PRZZLEFT JSR PRZZSMAL LDA #8 STA PRNTYINC LDA #2 STA SPARM+7 ; PRINT1 LDX #0 PRINT2 JSR GETBYTE CMP #' ' BLT PRINT3 STA PRINBUFF,X INX BNE PRINT2 ; PRINT3 ASL TAY LDA PRINT5,Y STA PRINT4+1 LDA PRINT5+1,Y STA PRINT4+2 CLC PRINT4 JSR $FFFF BCC PRINT2 BCS PRINT1 ; ; Addresses of print options ; PRINT5 ADR PRZZDONE ADR PRZZNORM ADR PRZZINVR ADR PRZZLEFT ADR PRZZRITE ADR PRZZCNTR ADR PRZZLOC ADR PRZZSMAL ADR PRZZBIG ADR PRZZSTR ADR PRZZSPC ADR PRZZHTAB ADR PRZZVTAB ADR PRZZCR ADR PRZZNOCR ADR PRZZBLAK ADR PRZZWITE ADR PRZZANY ADR PRZZCSPC ADR PICDRAW2 ADR PRZZRTAB ADR PRZZRTB2 ADR PRZZKERN ADR PRZZRINV ADR GOOBER1 ; PRZZDONE PLA PLA RTS ; PRZZNORM LDA #2 HEX 2C PRZZINVR LDA #3 STA SPARM+0 RTS ; PRZZLEFT LDA #0 HEX 2C PRZZRITE LDA #1 HEX 2C PRZZCNTR LDA #2 STA SPARM+1 RTS ; PRZZHTAB JSR GETBYTE STA SPARM+2 STA PRNTXLO JSR GETBYTE STA SPARM+3 STA PRNTXHI RTS ; PRZZLOC JSR PRZZHTAB PRZZVTAB JSR GETBYTE STA SPARM+4 RTS ; PRZZCSPC JSR GETBYTE STA SPARM+7 RTS ; PRZZSMAL LDA #0 HEX 2C PRZZBIG LDA #1 STA SPARM+8 RTS ; PRZZKERN JSR GETBYTE STA SPARM+11 RTS ; PRZZSTR JSR GETBYTE STA >0+1 JSR GETBYTE STA >0+2 LDY #0 ^0 LDA $FFFF,Y BEQ >2 CMP #$20 BLT >1 STA PRINBUFF,X INX ^1 INY BNE <0 ; PRZZSPC JSR GETBYTE STA PRNTYINC ^2 CLC RTS ; PRZZRTAB JSR PRZZNOCR JSR GETBYTE CLC ADC PRNTXLO STA SPARM+2 LDA PRNTXHI ADC #0 STA SPARM+3 SEC RTS ; PRZZRTB2 JSR PRZZRTAB STA PRNTXHI LDA SPARM+2 STA PRNTXLO RTS ; PRZZCR JSR PRZZNOCR LDY #00 PRNTXLO = *-1 LDA #00 PRNTXHI = *-1 STY SPARM+2 STA SPARM+3 LDA SPARM+4 CLC ADC #00 PRNTYINC = *-1 STA SPARM+4 SEC RTS ; PRZZNOCR LDA #0 STA PRINBUFF,X LDY #PRINBUFF LDA /PRINBUFF STY SPARM+9 STA SPARM+10 JSR STROUT SEC RTS ; PRZZANY JSR GETBYTE HEX 2C PRZZBLAK LDA #$00 HEX 2C PRZZWITE LDA #$7F HEX 2C PRZZRINV LDA #$FF ASL PHP LSR TAY PLP LDA #$A0 BCC *+3 ASL ORA #$09 ; PHA LDX #0 ^1 JSR GETBYTE CMP #$FF BEQ >2 STA RTOSPARM,X ^2 INX CPX #4 BLT <1 PLA JSR RTOS SEC RTS ;----------- ; ; JSR PRINTGRP ; BYT ; BYT <# items> ; ADR ; PRINTGRP JSR GETINIT JSR GETWORD STX PRINTGM0 STA TMP2 JSR GETWORD STX TMP0 STA TMP1 JSR SAVEGOT ; ^0 JSR PRINTGR2 LDY #0 ^1 LDA (TMP0),Y INC TMP0 BNE *+4 INC TMP1 TAX BNE <1 DEC TMP2 BNE <0 JMP RESTGOT ; ; Print string pointed to ; by TMP0.TMP1 ; PRINTGR2 LDX TMP0 LDA TMP1 STX PRINTGM1+1 STA PRINTGM1+2 JSR PRINT PRINTGM0 BYT PRCNTR PRINTGM1 .DA #PRSTR,$FFFF,#CR,#0 RTS ;----------- GOOBER0 ADR GOOBER2 GOOBER1 LDA READPROT JMP (GOOBER0) ;----------- ; ; JSR INPUT ; ADR ; BYT ; .DA ; BYT ; INPUT JSR GETINIT JSR GETWORD STX INPUTP3 STA INPUTP3+1 JSR GETBYTE STA STRGET+5 JSR GETWORD STX INPUTP1 STA INPUTP1+1 JSR GETBYTE STA INPUTP2 LDX #INPUTP LDY /INPUTP STX STRGET+3 STY STRGET+4 JMP STRGET ; INPUTP HEX 0200 INPUTP1 ADR 0 INPUTP2 ADR 0 HEX 000200 INPUTP3 ADR 0 HEX 00 ;----------- READPROT HEX 00 ;----------- ; ; Clear screen routines ; CLSCREEN JSR PRINT BYT RTOSBLAK,0,0,40,192,0 BIT $C057 BIT $C052 BIT $C050 RTS ; CLS1 JSR PRINT BYT RTOSBLAK,1,17,38,165,0 RTS ; CLS2 JSR PRINT BYT RTOSBLAK,1,28,38,154,0 RTS ;----------- GOOBER2 INC READPROT JMP GOOBER3 ;----------- ; CLS3 JSR PRINT BYT RTOSBLAK,1,31,38,151,0 RTS ; ; GET routines ; GETINIT TSX LDA $103,X STA GOTBYTE+1 LDA $104,X STA GOTBYTE+2 LDA #>0-1 STA $103,X LDA />0-1 STA $104,X RTS ; ^0 PHA JSR GETBYTE PLA JMP (GOTBYTE+1) ; ; Get a word ; X=lo, A=hi ; GETWORD JSR GETBYTE TAX ; ; Get a byte ; GETBYTE INC GOTBYTE+1 BNE GOTBYTE INC GOTBYTE+2 GOTBYTE LDA $FFFF RTS ; ; Save GOTBYTE info ; SAVEGOT LDY GOTBYTE+1 LDA GOTBYTE+2 STY RESTGOT+1 STA RESTGOT+3 RTS ; ; Restore GOTBYTE info ; RESTGOT LDY #00 LDA #00 STY GOTBYTE+1 STA GOTBYTE+2 RTS ;----------- ; ; JSR SELECT ; BYT ,,, ; ADR ; SELECT STY SELCUR LDA SCALING STA SCALSAVE LSR SCALING JSR GETINIT ; LDX #0 STX SELWERDP ^0 JSR GETBYTE STA SELECTXS,X INX CPX #6 BLT <0 ; ASL SELECTXS LDY #'V'-$40 BCS *+4 LDY #$FF STY SELVRMOD LSR SELECTXS ; ; Set input device to default ; LDA SELCUR JSR SELSET ; SELLOOP JSR SELECTIV JSR SAVEGOT JSR SELSUB JSR RESTGOT ; ^0 LDY #0 JSR DEVICERD BCS >1 ; ; If button was down at last ; reading, then ignore. ; ASL BMI >1 ; ; If button is down now, then ; selection made ; BCS SELDONE TYA LSR LSR CMP #00 SELDEVY = *-1 STA SELDEVY BEQ >1 CMP SELECTMX BLT SELNEW ; ; Too big, so set device to ; maximum. ; LDX SELECTMX DEX BPL >9 ; ^1 JSR POLEKEY BPL <0 ; LDX SELCUR CMP #8 BEQ SELUP CMP #$0B BEQ SELUP CMP #$15 BEQ SELDOWN CMP #$0A BEQ SELDOWN CMP #ESC BEQ >2 CMP #CR BEQ SELDONE CMP #00 SELVRMOD = *-1 BEQ SELVERS JSR SELDOWRD BNE <0 ; SELVERS ROR SELWERDP ; SELDONE CLC ^2 PHP JSR SELECTIV PLP LDA #00 SCALSAVE = *-1 STA SCALING LDA SELWERDP LDY SELCUR RTS ;--- ; ; Since keyboard was used, ; update device also. ; ^9 TXA JSR SELSET SELNEW PHA JSR SELECTIV PLA STA SELCUR BPL SELLOOP ; SELUP DEX BPL <9 LDX SELECTMX DEX BPL <9 ; SELDOWN INX CPX SELECTMX BLT <9 LDX #0 BEQ <9 ; SELECTIV LDA SELCUR ASL ASL ASL ADC SELECTYS STA RTOSPARM+1 LDA #9 STA RTOSPARM+3 LDY SELECTXS LDA SELECTXW STY RTOSPARM STA RTOSPARM+2 LDA #$49 LDY #$7F JMP RTOS ; SELDOWRD LDY SELWERDP CMP SELWEIRD,Y BEQ >0 LDY #$FF HEX 24 ^0 INY STY SELWERDP LDA #1 RTS ; ; Set input device ; SELSET PHA STA SELDEVY ASL ASL ADC #2 TAY LDX #0 JSR DEVICEST PLA RTS ; SELWEIRD BYT 'STEVEN',0 SELWERDP BRK ;----------- GOOBER30 ADR GOOBER4 GOOBER3 AND #7 BEQ >0 CLC RTS HEX 6D ^0 JMP (GOOBER30) ;----------- SELSUB LDA SELCUR ASL TAX JMP (SELADR) ; SELCUR BRK ; SELECTXS BRK SELECTXW BRK SELECTYS BRK SELECTMX BRK SELADR ADR 0 ;----------- HEX 20 GOOBER4 JSR CHEKPROT CLC RTS ;----------- ; ; JMP to routine given in Y ; ; JSR JMPVECTS ; ADR ROUTINE0 ; ADR ROUTINE1 ; JMPVECTS JSR GETINIT ^0 JSR GETWORD STX TMP0 STA TMP1 DEY BPL <0 PLA PLA JMP (TMP0) ;----------- ; ; JSR LINES ; BYT 'V' (or 'H') for vertical/horiz ; BYT ,,, ; BYT 1 (terminate) ; ; TMP0=length ; LINES LDA #0 STA LINEXOFF JSR GETINIT JSR GETBYTE STA LINETYPE BPL >0 JSR GETBYTE STA LINEXOFF ; ^0 JSR GETBYTE CMP #1 BEQ LINERTS STA LINECOLR JSR GETBYTE TAX JSR GETBYTE STA LINEY JSR GETBYTE STA TMP0 LDA #00 LINETYPE = *-1 AND #$7F CMP #'V' BEQ LINEV ; LINEH JSR LINEDOT INX DEC TMP0 BNE LINEH JMP <0 ; LINEV JSR LINEDOT INC LINEY DEC TMP0 BNE LINEV JMP <0 ; LINEDOT LDY #00 LINEY = *-1 LDA YBASELO,Y CLC ADC #00 LINEXOFF = *-1 STA HIRES LDA YBASEHI,Y STA HIRES+1 STY TMP2 LDY XBYTEOFF,X TYA EOR TMP2 LSR LDA #00 LINECOLR = *-1 BCC >0 LSR ^0 AND XBITS,X STA TMP2 LDA XBITS,X EOR #$FF AND (HIRES),Y ORA TMP2 STA (HIRES),Y LINERTS RTS ;----------- ; ; JSR PARSE ; .DA #'A',JMPA ; .DA #'B',JMPB ; BRK ; ; If no match, then routine simply ; continues to execute code after ; the BRK instruction. ; ; all registers preserved ; PARSE STA TMP0 JSR SAVEREGS JSR GETINIT ^0 JSR GETBYTE BEQ >1 EOR TMP0 PHA JSR GETWORD STX TMP1 STA TMP2 PLA BNE <0 PLA PLA JSR RESTREGS JMP (TMP1) ^1 JMP RESTREGS ;----------- ; ; Draw arrow at X,Y ; A=0 for IJMK, 1 for WASZ ; SHOWAROW STX ARROWX STY ARROWY ASL ASL STA AROWTYPE ; ; Compute bit location by ; multiplying X by 7. ; TXA ASL ASL ASL SEC SBC ARROWX STA ARROWX2 ; JSR PICDRAW ARROWX BYT 26 ARROWY BYT 1 BYT 6,37 HEX 82400184600384300684180C840C1884 HEX 06308403608340014001826001400382 HEX 40014001824001400182460140318247 HEX 01407181407D01405F01608403308406 HEX 18840C0C84180684300C841818840C30 HEX 8406608403407D01405F018147014071 HEX 82460140318240014001824001400182 HEX 60014003824001400183036084063084 HEX 0C1884180C84300684600384400182 ; LDA #0 STA TMP5 ^1 LDY #00 AROWTYPE = *-1 INC AROWTYPE LDA SHOWARTB,Y STA >3+0 LDY TMP5 LDA ARROWOFX,Y CLC ADC #00 ARROWX2 = *-1 STA >2+1 LDA ARROWOFY,Y ADC ARROWY STA >2+3 JSR PRINT BYT PRCNTR ^2 .DA #PRLOC,00,#00 ^3 BYT ' ',NOCR,0 ; INC TMP5 LDA TMP5 CMP #4 BLT <1 RTS ; SHOWARTB BYT 'IJKMWASZ' ; ARROWOFX BYT 21,12,30,21 ARROWOFY BYT 7,15,15,23 ;----------- ; ; Convert number to text ; given in A, return ; Y=tens digit, A=ones digit ; MAKENUMB LDY #$FF SEC ^0 INY SBC #10 BCS <0 ADC #10 RTS ;----------- ; ; Print a number ; ; Given X,Y and A=number ; NUMBER STX DIGITX STY DIGITY JSR MAKENUMB PHA JSR DIGITPRN PLA INC DIGITX ; TAY DIGITPRN LDA SYSFONT+$86,Y STA TMPLO LDA SYSFONT+$C1,Y STA TMPHI LDA #7 STA TMP2 LDX #00 DIGITY = *-1 ^0 LDA YBASELO,X STA HIRES LDA YBASEHI,X STA HIRES+1 LDY #0 LDA (TMPLO),Y INC TMPLO BNE *+4 INC TMPHI LSR TAY LDA FLIPPER,Y LDY #00 DIGITX = *-1 STA (HIRES),Y INX DEC TMP2 BNE <0 RTS ;----------- ; ; Ram TO Screen routine ; A is opcode ; Y is operand ; RTOSPARM EPZ $3A ; RTX EPZ RTOSPARM RTY EPZ RTOSPARM+1 RTXL EPZ RTOSPARM+2 RTYL EPZ RTOSPARM+3 RTADRL EPZ RTOSPARM+4 RTADRH EPZ RTOSPARM+5 ; RTSCRL EPZ RTOSPARM+6 RTSCRH EPZ RTOSPARM+7 ; RTOS STA RTOSMD0 STY RTOSMD0+1 ; LDX RTY ^0 LDA YBASEHI,X STA RTSCRH LDA YBASELO,X CLC ADC RTX STA RTSCRL LDY RTXL DEY ^1 LDA (RTSCRL),Y RTOSMD0 EOR #$7F STA (RTSCRL),Y DEY BPL <1 LDA RTADRL CLC ADC RTXL STA RTADRL BCC >2 INC RTADRH ^2 INX DEC RTYL BNE <0 RTS ;----------- ; ; PRESS SPACE BAR ; FOR MORE ; SPACEBAR STA >0+0 JSR PICDRAW ^0 BYT 26,181,14,11 HEX 787979793C707971717D70637303181B HEX 1B0C0618181B1B0C3036360678797978 HEX 3C7079791B3C70737703185819406181 HEX 1B181B0C3036360318187B793C701918 HEX 737D703336069178797C701C4F4F0F86 HEX 184C4D715F59590186784C7D305B594F HEX 0786184C6D3058594D018618784C3118 HEX 4F590F83 RTS ;----------- ; ; TO GO TO MAIN MENU ; ESCMAIN JSR PRINT BYT RTOSWITE,0,183,40,9 BRK ; JSR MUSIC ; JSR PRINT .DA #PRLOC,140,#174 BYT PRCNTR BYT ' TO GO TO MAIN MENU',CR BRK JSR GETKEY CMP #ESC BNE >0 JMP MAINMENU ; ^0 JSR PRINT BYT RTOSBLAK,1,174,38,7,0 JMP ESCBACK ;----------- ; ; ; ICL "S:SUBPAK4"