* ZORK.TXT POLCAT: EQU $A000 DEVOUT: EQU $A002 HIMEM: EQU $9E00 ORG $0E00 RMB $300-$C0-$C0 STACK: EQU * RMB $C0+$C0 ZSTACK: EQU * GRANBUF:EQU $600 DIRBUF: EQU $0700 VPGNUMS:RMB 64 VPGPREV:RMB 64 VPGNEXT:RMB 64 TEXTBUF:RMB 64 ORG (*+255).AND.$FF00 SETDP *<-8 DIRPAG: EQU *<-8 * * CONFIGURATION PARAMETERS * HIMEM0: FDB HIMEM LCASE: FCB 1 TANDY: FCB 0 STEP: FCB 2 DRIVE: FCB 1 BEEPVAL:FDB $D00C MOREMSG:FCC \mmMOREmm\ * ZERCON: FDB 0 * * DATA FILE READ VARIABLES * DIRSEC: FCB 0 DATFIL: FCB 0 * * SCREEN PRINT VARIABLES * CURPOS: FDB $0420 CURCOL: FCB 0 * * BELL DELAY COUNTERS * DLY1: FCB 0 DLY2: FCB 0 * * Z-CODE INTERPRETER VARS * BLKPTR: FDB 0 * TEXTCNT:FCB 0 TEXTPTR:FDB 0 MORECNT:FCB 0 PRTMODE:FCB 0 MOREBUF:FDB 0,0,0,0 * RNDSEED:FDB 0,0 * ZSTACKC:FCB 0 ZSTACKP:FDB 0 RSTACKP:FDB 0 RSTACKC:FCB 0 * ENCODFR:FDB 0,0,0 ENCODTO:FDB 0,0,0 * P1: FDB 0 P2: FDB 0 P3: FDB 0 P4: FDB 0 NPARMS: FCB 0 CURINST:FCB 0 OFFSET: FDB 0 * DATPTR: FDB 0 DATBLKS:FCB 0 GLBVARS:FDB 0 COMNWDS:FDB 0 VPAGES: FDB 0 VPGTOTL:FCB 0 * EXEBLK: FCB 0 EXEBYT: FDB 0 EXBYTP: FDB 0 EXPAGIM:FCB 0 EXVPAGE:FCB 0 * STRBLK: FCB 0 STRBYT: FDB 0 STRBYTP:FDB 0 STPAGIM:FCB 0 STVPAGE:FCB 0 * VPGHEAD:FCB 0 VPGTAIL:FCB 0 * SHFTTMP:FCB 0 SHFTLCK:FCB 0 STRSEG: FCB 0 STRWD: FDB 0 * LOCVARS:FCC /112233445566778899AABBCCDDEEFF/ * TEMPB: FCB 0 TEMPC: FCB 0 TEMPD: FCB 0 TEMPE: FCB 0 * WORDPTR:FDB 0 ENCDLEN:FCB 0 WORDLEN:FCB 0 WORDCNT:FDB 0 * * DSKCON PARAMETERS * DFUNC: FCB 0 DDRIVE: FCB 0 DTRACK: FCB 0 DSECTOR:FCB 0 DBUFFER:FDB 0 DSTATUS:FCB 0 ORG ((*+255).AND.$FF00)-11 ZFNAME: FCC \ZORK DAT\ START: ORCC #$50 LDA #$7E LDX #NMI STA $0109 STX $010A LDX #IRQ STA $010C STX $010D LDS #STACK CLR ,-S CLR ,-S LDA #$55 STA $71 LDX #RESET STX $72 STA $FFDF ANDCC #$EF LDA #DIRPAG TFR A,DP LDA $0106 CMPA #$7E BEQ START1 LDA #$3B STA $0106 START1: CLR ZERCON CLR ZERCON+1 JSR GETGRAN LEAY restart -- BREAK->quit \[0] XBA3: JSR VIDOUT XBA4: LDA ,X+ BNE XBA3 RTS XBB: JSR CRLF JMP MAIN XBC: JSR UPDSCR JMP MAIN XE0: LDD P1 LBEQ XTYP2D LDA RSTACKC JSR PUSHA LDD RSTACKP JSR PUSHD LDD EXEBYT JSR PUSHD LDA EXEBLK PSHS A CLR EXPAGIM CLRA LDB P1+1 ASLB ROLA STD EXEBYT LDA P1 STA EXEBLK JSR GETXBYT TFR A,B PULS A PSHS D LDY #LOCVARS TSTB BEQ XE02 XE01: PSHS D LDX ,Y JSR PUSH JSR GETXBYT STA ,--S JSR GETXBYT STA 1,S PULS X STX ,Y++ PULS D DECB BNE XE01 XE02: LDB NPARMS DECB BEQ XE04 LDX #P2 LDY #LOCVARS XE03: LDU ,X++ STU ,Y++ DECB BNE XE03 XE04: PULS D JSR PUSHD LDA ZSTACKC STA RSTACKC LDD ZSTACKP STD RSTACKP JMP MAIN XE1: LDD P2 ASLB ROLA ADDD P1 ADDD DATPTR TFR D,X LDD P3 STD ,X JMP MAIN XE2: LDD P2 ADDD P1 ADDD DATPTR TFR D,X LDD P3 STB ,X JMP MAIN XE3: JSR INFOP1 XE31: LDA ,X ANDA #$1F CMPA P2+1 BEQ XE33 BLS XE32 JSR NXTINFO BRA XE31 XE32: LDB #8 LBSR ERROR XE33: JSR INFOLEN INX DECA BMI XE34 BNE XE32 LDD P3 STD ,X JMP MAIN XE34: LDD P3 STB ,S JMP MAIN XE4: JSR UPDSCR JSR RANDOM LDD P1 ADDD DATPTR STD P1 LDD P2 ADDD DATPTR STD P2 JSR LINPUT STB TEMPB CLR TEMPC LDX P2 INX CLR ,X+ STX WORDPTR LDX P1 INX XE41: LDY P2 LDA ,Y CMPA 1,Y XE41A: LBEQ MAIN LDD TEMPB BEQ XE41A LDA TEMPC CMPA #6 BNE XE41B JSR XE46 XE41B: LDA TEMPC BNE XE43 LDB #6 LDY #ENCODFR XE42: CLR ,Y+ DECB BNE XE42 TFR X,D SUBB P1+1 LDY WORDPTR STB 3,Y LDA ,X JSR XE411 BCS XE44 LDA ,X JSR XE47 BCC XE43 INX DEC TEMPB BRA XE41 XE43: LDA TEMPB BEQ XE45 LDA ,X JSR XE47 BCS XE45 LDY #ENCODFR LDB TEMPC STA B,Y DEC TEMPB INC TEMPC INX BRA XE41 XE44: STA ENCODFR INC TEMPC DEC TEMPB INX XE45: LDA TEMPC BEQ XE41 LDY WORDPTR STA 2,Y PSHS X JSR ENCODE JSR WSEARCH PULS X LDY WORDPTR STD ,Y LEAY 4,Y STY WORDPTR LDY P2 INC 1,Y CLR TEMPC JMP XE41 XE46: LDA TEMPB BEQ XE46A LDA ,X BSR XE47 BCS XE46A INX DEC TEMPB INC TEMPC BRA XE46 XE46A: RTS XE47: BSR XE411 BCS XE46A LDB #$0A LDY #XE412 XE48: CMPA ,Y+ BEQ XE410 DECB BNE XE48 XE49: CLC RTS XE410: SEC RTS XE411: PSHS A LDY DATPTR LDD 8,Y LEAY D,Y PULS A LDB ,Y+ BEQ XE49 BRA XE48 XE412: FCC * .,?* FCB 13,10,9,12 FCC *"'* XE5: LDA P1+1 JSR CHROUT JMP MAIN XE6: LDX P1 JSR PRTNUM JMP MAIN XE7: JSR RANDOM LDY P1 JSR DIVXYU LEAX ,U INX JMP XTYP2X XE8: LDX P1 JSR PUSH JMP MAIN XE9: JSR POP LDA P1+1 JSR STYP2A JMP MAIN TEXT: STA $FFC0 STA $DFC2 STA $FFC4 STA $FFC6 STA $FFC9 STA $FFCA STA $FFCC STA $FFCE STA $FFD0 STA $FFD2 CLR $FF22 RTS CLSTEXT:PSHS X LDX #$400 CLSTXT1:STA ,X+ CMPX #$5FF BLS CLSTXT1 PULS X,PC ERRMSG1:FCC \ ERROR #\[0] ERRMSG2:FCC \ AT ADDRESS \[0] ERRMSG3:FCC \!!! \[0] ERROR: PSHS U,B LDA #$80 * BSR CLSTEXT BSR TEXT * LDU #$04E0 LDU #$0400 LDX #ERRMSG1 JSR DSPSTR LDA ,S+ JSR DSP2HEX LDX #ERRMSG2 JSR DSPSTR LDX 2,S JSR DSP4HEX LDX #ERRMSG3 JSR DSPSTR * LDU #$04E0 LDU #$0400 JSR BLINK PULS U SWI JMP START GETGRAN:LDA #2 LDB DRIVE STD DFUNC LDD #$1102 STD DTRACK LDX #GRANBUF STX DBUFFER JSR DSKCON LBSR IOERR RTS OPEN: PSHS Y,X CLR DIRSEC CLR ,-S OPEN1: LDA ,S BSR RDDIR LDA ,X BEQ OPEN4 INCA BEQ OPEN5 LDY 3,S LDB #11 OPEN2: LDA ,X+ CMPA ,Y+ BNE OPEN4 DECB BNE OPEN2 LDB 2,X OPEN3: PULS A,X,Y,PC OPEN4: INC ,S BRA OPEN1 OPEN5: LDB #$FF STB ,S BRA OPEN3 RDDIR: PSHS A LSRA LSRA LSRA ADDA #3 STA DSECTOR LDA #$11 STA DTRACK LDX #DIRBUF STX DBUFFER LDA #2 LDB DRIVE STD DFUNC LDA DIRSEC CMPA DSECTOR BEQ RDDIR1 JSR DSKCON BSR IOERR RDDIR1: LDA DSECTOR STA DIRSEC PULS A ASLA ASLA ASLA ASLA ASLA LDX #DIRBUF LEAX A,X RTS READ: BSR RDWRT FCB 2 WRITE: BSR RDWRT FCB 3 RDWRT: BSR SECTRAN BNE RDWRT1 LDA [,S++] STA DFUNC STX DBUFFER JSR DSKCON BSR IOERR NOIOERR:RTS RDWRT1: LDA [,S++] CMPA #3 BEQ SECTR3A PSHS B,X CLRB RDWRT2: CLR ,X+ DECB BNE RDWRT2 PULS X,B,PC IOERR: TST DSTATUS BEQ NOIOERR LDB #1 LBRA ERROR POLCAT1:STA $FFDE JSR [POLCAT] STA $FFDF RTS SECTRAN:PSHS Y,X,D LDX #GRANBUF TFR Y,D CLR ,-S SECTRN1:SUBD #9 BLO SECTRN2 INC ,S BRA SECTRN1 SECTRN2:PULS A ADDB #9 PSHS B LDB 2,S SECTRN3:DECA BMI SECTRN4 LDB B,X CMPB #$43 BLS SECTRN3 PULS A CMPB #$C0 BLO SECTR3A CMPB #$CA BLO SECTRN5 SECTR3A:LDB #2 JSR ERROR SECTRN4:TFR B,A CLRB LSRA ROLB INCA CMPA #$12 SBCA #0 STA DTRACK LDA #9 MUL ADDB ,S+ INCB STB DSECTOR LDA DRIVE STA DDRIVE CLRA clz SECTRN5:PULS D,X,Y,PC LOF: PSHS U,B LDU #GRANBUF LDX ZERCON LOF1: LDB B,U CMPB #$43 BHI LOF2 LEAX 9,X BRA LOF1 LOF2: SUBB #$C0 BLO LOF4 CMPB #9 BHI LOF4 LEAX B,X BEQ LOF3 DEX LOF3: PULS B,U,PC LOF4: LDB #2 JSR ERROR READBLK:PSHS Y,X,D STX BLKPTR TFR A,B CLRA ASLB ROLA TFR D,Y BSR RDBLK1 LEAY 1,Y BSR RDBLK1 PULS D,X,Y,PC RDBLK1: LDB DATFIL LDX BLKPTR JSR READ LEAX $100,X STX BLKPTR RTS RANDOM: PSHS D LDB #2 RANDOM1:PSHS B LDX #RNDSEED LDA ,X SEC LDB #8 RANDOM2:PSHS B ROLA ROLA ROLA EORA ,X ROLA ROLA LDX #RNDSEED ROL ,X+ ROL ,X+ ROL ,X+ ROL ,X PULS B DECB BNE RANDOM2 PULS B DECB BNE RANDOM1 LDX RNDSEED+2 PULS D,PC GETXBYT:LDA EXPAGIM BEQ GETXBY1 LDX EXBYTP LDA ,X+ STX EXBYTP INC EXEBYT+1 BNE RTS1 INC EXEBYT LDB EXEBYT DECB BEQ RTS1 CLR EXEBYT CLR EXPAGIM INC EXEBLK RTS1: RTS GETXBY1:LDA EXEBLK LDX DATPTR CMPA DATBLKS BLO GETXBY3 JSR FINDPG STA EXVPAGE BCS GETXBY4 GETXBY2:JSR QUEPAG LDA EXVPAGE LDX VPAGES GETXBY3:ASLA CLRB LEAX D,X LDD EXEBYT LEAX D,X STX EXBYTP LDA #$FF STA EXPAGIM BRA GETXBYT GETXBY4:CMPA STVPAGE BNE GETXBY5 CLR STPAGIM GETXBY5:LDX VPAGES ASLA CLRB LEAX D,X LDA EXEBLK JSR READBLK LDA EXVPAGE LDX #VPGNUMS LDB EXEBLK STB A,X BRA GETXBY2 FINDPG: LDB VPGTOTL CLR ,-S LDX #VPGNUMS FINDPG1:CMPA ,X+ BEQ FINDPG2 INC ,S DECB BNE FINDPG1 LEAS 1,S LDA VPGTAIL SEC RTS FINDPG2:PULS A,PC QUEPAG: STA TEMPC LDA VPGHEAD CMPA TEMPC BEQ RTS2 STA TEMPB LDA TEMPC STA VPGHEAD LDX #VPGPREV LDB A,X STB TEMPE LDB TEMPB STB A,X LDX #VPGNEXT LDA TEMPC LDB A,X STB TEMPD LDB #$FF STB A,X LDA TEMPD LDX #VPGPREV LDB TEMPE STB A,X LDA TEMPB LDX #VPGNEXT LDB TEMPC STB A,X LDA TEMPE CMPA #$FF BEQ QUEPAG1 LDX #VPGNEXT LDB TEMPD STB A,X RTS2: RTS QUEPAG1:LDA TEMPD STA VPGTAIL RTS GETSBYT:BSR GETSBY1 PSHS A BSR GETSBY1 TFR A,B PULS A,PC GETSBY1:LDA STPAGIM BEQ GETSBY2 LDX STRBYTP LDA ,X+ STX STRBYTP INC STRBYT+1 BNE RTS2 INC STRBYT LDB STRBYT DECB BEQ RTS2 CLR STRBYT CLR STPAGIM INC STRBLK RTS GETSBY2:LDA STRBLK LDX DATPTR CMPA DATBLKS BLO GETSBY4 JSR FINDPG STA STVPAGE BCS GETSBY6 GETSBY3:JSR QUEPAG LDA STVPAGE LDX VPAGES GETSBY4:ASLA CLRB LEAX D,X LDD STRBYT LEAX D,X STX STRBYTP LDA #$FF STA STPAGIM BRA GETSBY1 GETSBY5:CMPA EXVPAGE BNE RTS2 CLR EXPAGIM GETSBY6:LDX VPAGES ASLA CLRB LEAX D,X LDA STRBLK JSR READBLK LDA STVPAGE LDX #VPGNUMS LDB STRBLK STB A,X BRA GETSBY3 MULXY: PSHS Y,X,D,CC LDA 3,S EORA 5,S STA ,S LDA 3,S BPL MULXY1 CLRA CLRB SUBD 3,S STD 3,S MULXY1: LDA 5,S BPL MULXY2 CLRA CLRB SUBD 5,S STD 5,S MULXY2: LDA 4,S LDB 6,S MUL STD 1,S LDD 4,S MUL ADDA 1,S STA 1,S LDA 3,S LDB 6,S MUL ADDA 1,S STA 1,S LDA ,S+ BPL MULXY3 CLRA CLRB SUBD ,S STD ,S MULXY3: PULS D,X,Y,PC DIVXYU: PSHS Y,X,CC CLR ,S BRA DIVXY2 DIVXY: PSHS Y,X,CC LDA 1,S EORA 3,S STA ,S LDA 1,S BPL DIVXY1 CLRA CLRB SUBD 1,S STD 1,S DIVXY1: LDA 3,S BPL DIVXY2 CLRA CLRB SUBD 3,S STD 3,S DIVXY2: LDY 1,S LDX 3,S PSHS Y,X LEAU ,S JSR DIV16U LDA 4,S BPL DIVXY3 CLRA CLRB SUBD 2,S STD 2,S DIVXY3: PULS U PULS D LEAS 1,S PULS X,Y,PC DIV16U: LDD ,U BEQ DIVZER CLRA CLRB STD ,--S INCB STD ,--S DIV1: ASL 1,U ROL ,U BCS DIV2 ASL 1,S ROL ,S BRA DIV1 DIV2: ROR ,U ROR 1,U LDD 2,U SUBD ,U BCS DIV3 STD 2,U LDD 2,S ADDD ,S STD 2,S DIV3: LSR ,S ROR 1,S BCC DIV2 LDD 2,S LDX 2,U STD 2,U STX ,U LEAS 4,S RTS DIVZER: LDB #$0D JSR ERROR ITEMA: PSHS D LDB #9 MUL ADDD #$35 ADDD DATPTR LDU DATPTR ADDD 10,U TFR D,X PULS D,PC INFOP1: LDA P1+1 BSR ITEMA LDD 7,X ADDD DATPTR TFR D,X LDA ,X+ ASLA LEAX A,X RTS INFOLEN:LDA ,X LSRA LSRA LSRA LSRA LSRA RTS NXTINFO:BSR INFOLEN ADDA #2 LEAX A,X RTS BITS: LDA P1+1 BSR ITEMA LDB P2+1 LSRB LSRB LSRB ABX LDB P2+1 ANDB #7 LDA #$80 BITS1: DECB BMI BITS2 LSRA BRA BITS1 BITS2: LDB ,X RTS BS0: LDA #$18 BRA CHROUT DUMPBU1:BSR MORE DUMPBUF:JSR CHROU5A LDA TEXTCNT BNE DUMPBU1 RTS MORE: DEC MORECNT BNE MORERTS LDA #$0E STA MORECNT BSR MORE4 MORERTS:LDA #$0D JSR VPOUT RTS MORE1: LDX #MOREBUF MORE2A: LDU #$05EC MORE2: LDB #8 MORE3: LDA ,X+ STA ,U+ DECB BNE MORE3 RTS MORE4: PSHS X,U LDX #$05EC LDU #MOREBUF BSR MORE2 MORE5: LDX #MOREMSG BSR MORE2A JSR POLCAT1 BNE MORE8 LDX #$8000 MORE6: DEX BNE MORE6 BSR MORE1 JSR POLCAT1 BNE MORE8 LDX #$8000 MORE7: DEX BNE MORE7 BRA MORE5 MORE8: BSR MORE1 PULS U,X,PC CRLF: LDA #$0D BSR CHROUT LDA #$0A CHROUT: TST PRTMODE LBNE VIDOUT PSHS U,X,D CMPA #7 BEQ CHROUT3 CMPA #8 BEQ CHROUT1 CMPA #12 BEQ CHROUT3 CMPA #13 BEQ CHROUT4 CMPA #27 BEQ CHROUT3 CMPA #$1F BLS CHROUT2 CHROUT1:LDX TEXTPTR STA ,X+ STX TEXTPTR INC TEXTCNT LDA TEXTCNT CMPA #32 BLS CHROUT2 BSR CHROUT5 JSR MORE CHROUT2:PULS D,X,U,PC CHROUT3:JSR VIDOUT PULS D,X,U,PC CHROUT4:BSR CHROU5A JSR MORE PULS D,X,U,PC CHROU5A:LDB TEXTCNT BEQ CHROUT5 LDX TEXTPTR PSHS X BSR CHROU14 PULS X BEQ CHROUT5 LDA #$20 STA ,X+ STX TEXTPTR INC TEXTCNT CHROUT5:LDX #TEXTBUF LDB TEXTCNT BEQ CHROU9A CMPB #32 BLO CHROUT6 LDB #32 CHROUT6:LDA ,X+ JSR VPOUT DEC TEXTCNT DECB BEQ CHROUT8 CMPA #$20 BEQ CHROUT6 CHROUT7:LDA ,X+ CMPA #$20 BEQ CHROU11 JSR VPOUT DEC TEXTCNT DECB BNE CHROUT7 CHROUT8:LDB TEXTCNT BEQ CHROU10 BSR CHROU14 BEQ CHROU10 DEX STB TEXTCNT LDU #TEXTBUF CHROUT9:LDA ,X+ STA ,U+ DECB BNE CHROUT9 LDX #TEXTBUF LDB TEXTCNT LEAX B,X STX TEXTPTR CHROU9A:RTS CHROU10:CLR TEXTCNT LDX #TEXTBUF STX TEXTPTR RTS CHROU11:DEX PSHS X,D BSR CHROU14 BEQ CHROU12 BSR CHROU17 BEQ CHROU12 PULS D,X BRA CHROUT6 CHROU12:PULS X,D BRA CHROUT8 CHROU13:DECB BEQ CHROU15 CHROU14:LDA ,X+ CMPA #$20 BEQ CHROU13 CHROU15:TSTB RTS CHROU16:DECB BEQ CHROU18 CHROU17:LDA ,X+ CMPA #$20 BNE CHROU16 CHROU18:TSTB RTS STRNXT: LDD EXEBYT STD STRBYT LDA EXEBLK STA STRBLK LDA EXPAGIM STA STPAGIM LDD EXBYTP STD STRBYTP BSR PRTSTR LDD STRBYT STD EXEBYT LDA STRBLK STA EXEBLK LDA STPAGIM STA EXPAGIM LDD STRBYTP STD EXBYTP RTS PRTSTR: CLR SHFTLCK CLR STRSEG LDA #$FF STA SHFTTMP PRTSTR1:JSR GETSEG BCS RTS4 TFR A,B TSTA LBEQ PRTSTR8 CMPA #3 BLS PRTSTR7 CMPA #5 LBLS PRTST11 JSR PRTST14 TSTA BNE PRTSTR4 LDA #$5B PRTSTR2:PSHS A ADDB ,S+ TFR B,A PRTSTR3:JSR CHROUT BRA PRTSTR1 PRTSTR4:DECA BNE PRTSTR5 LDA #$3B BRA PRTSTR2 PRTSTR5:TFR B,A CMPA #6 BEQ PRTSTR6 SUBA #8 BLO PRTSTR9 LDX #PRTST13 LDA A,X BRA PRTSTR3 PRTSTR6:JSR GETSEG ASLA ASLA ASLA ASLA ASLA PSHS A JSR GETSEG ADDA ,S+ BRA PRTSTR3 RTS4: RTS PRTSTR7:DECA ASLA ASLA ASLA ASLA ASLA PSHS A JSR GETSEG TFR A,B ADDB ,S+ LDX SHFTLCK LDY STRWD PSHS Y,X LDX STRBYT LDA STRBLK PSHS X,A LDX COMNWDS CLRA ASLB ROLA LEAX D,X LDB ,X+ STB STRBLK LDB ,X CLRA ASLB ROLA STD STRBYT CLR STPAGIM JSR PRTSTR CLR STPAGIM PULS A,X STA STRBLK STX STRBYT PULS X,Y STY STRWD STX SHFTLCK BSR PRTST14 JMP PRTSTR1 PRTSTR8:LDA #$20 LBRA PRTSTR3 PRTSTR9:LDA #$0D JSR CHROUT LDA #$0A LBRA PRTSTR3 PRTST10:SUBB #3 STB SHFTTMP LBRA PRTSTR1 PRTST11:BSR PRTST14 TSTA BEQ PRTST10 DECA ASLA PSHS B ADDA ,S+ SUBA #4 LDX #PRTST12 LDA A,X STA SHFTLCK LBRA PRTSTR1 PRTST12:FCB 1,0,0,2 PRTST13:FCC *0123456789.,!?*[$5F]*#'"/\-:()* PRTST14:LDA SHFTLCK TST SHFTTMP BMI PRTST15 LDA SHFTTMP CLR SHFTTMP DEC SHFTTMP PRTST15:RTS GETSEG: LDA STRSEG BMI GETSEG4 BNE GETSEG1 INCA STA STRSEG JSR GETSBYT STD STRWD LSRA LSRA ANDA #$1F CLC RTS GETSEG1:DECA BNE GETSEG2 LDA #2 STA STRSEG LDD STRWD ASLB ROLA ASLB ROLA ASLB ROLA ANDA #$1F CLC RTS GETSEG2:CLR STRSEG LDD STRWD BPL GETSEG3 DEC STRSEG GETSEG3:TFR B,A ANDA #$1F CLC RTS GETSEG4:DEC STRSEG INCA BEQ GETSEG5 LDB #9 JSR ERROR GETSEG5:SEC RTS PRTNEG: LDA #'- JSR CHROUT NEGX: PSHS X,D CLRA CLRB SUBD 2,S STD 2,S PULS D,X,PC PRTNUM: PSHS X LDD ,S++ BPL PRTNUM1 BSR PRTNEG PRTNUM1:PSHS X LDX #DECTBL CLR ,-S PRTNUM2:CLR ,-S LDD 2,S PRTNUM3:SUBD ,X BLO PRTNUM4 INC ,S BRA PRTNUM3 PRTNUM4:ADDD ,X++ STD 2,S LDA ,S+ BNE PRTNUM5 TST ,S BEQ PRTNUM6 PRTNUM5:INC ,S ADDA #'0 JSR CHROUT PRTNUM6:LDD ,X BNE PRTNUM2 LDA ,S+ BNE PRTNUM7 LDA #'0 JSR CHROUT PRTNUM7:PULS X,PC DECTBL: FDB 10000 FDB 1000 FDB 100 FDB 10 FDB 1 FDB 0 T2INC: LDB #1 FCB $8C cmpx T2DEC: LDB #$FF PSHS B LDA P1+1 JSR LTYP2A PULS B LEAX B,X PSHS X JSR STYP2A PULS D,PC INISTRB:STA STRBLK LSR STRBLK INISTR1:ANDA #1 STD STRBYT CLR STPAGIM RTS INISTRW:STA STRBLK ASLB ROLA BRA INISTR1 DSCRBA: JSR ITEMA LDD 7,X ADDD #1 JSR INISTRB JMP PRTSTR FILLER: EQU $80 UPDSCR: LDX CURPOS LDB CURCOL PSHS X,B LDX #$0400 STX CURPOS CLR CURCOL LDA #1 STA PRTMODE LDX DATPTR LDA 1,X BITA #2 BNE UPDSCR0 LDA #FILLER JSR CHROUT LDA #$10 JSR LTYP2A TFR X,D TFR B,A JSR DSCRBA UPDSCR1:LDX CURPOS CMPX #$0414 BHS UPDSCR2 LDA #FILLER JSR CHROUT BRA UPDSCR1 UPDSCR2:LDA #'S JSR CHROUT LDA #'= JSR CHROUT LDA #$11 JSR LTYP2A JSR PRTNUM UPDSCR3:LDA #FILLER JSR CHROUT LDX CURPOS CMPX #$041A BLO UPDSCR3 LDA #'M JSR CHROUT LDA #'= JSR CHROUT LDA #$12 JSR LTYP2A JSR PRTNUM UPDSCR4:LDA CURCOL CMPA #32 BEQ UPDSCR5 LDA #FILLER JSR CHROUT BRA UPDSCR4 UPDSCR5:LDX CURPOS LDA ,X JSR VIDINV STA ,X PULS B,X STB CURCOL STX CURPOS CLR PRTMODE RTS UPDSCR0:LDB #$0C JSR ERROR LINPUT: LDA #15 STA MORECNT JSR DUMPBUF LDA #1 STA PRTMODE LDX P1 LDB ,X+ STB TEMPD CLR TEMPE LINPUT1:JSR POLCAT1 BEQ LINPUT1 CMPA #3 BEQ LINPUT4 CMPA #8 BEQ LINPUT3 CMPA #12 BEQ LINPUT4 CMPA #13 BEQ LINPUT7 CMPA #$15 BEQ LINPUT4 CMPA #$1F BLS LINPUT6 LDB TEMPD CMPB TEMPE BEQ LINPUT6 JSR CHROUT CMPA #'A BLO LINPUT2 CMPA #'Z BHI LINPUT2 ADDA #$20 LINPUT2:STA ,X+ INC TEMPE BRA LINPUT1 LINPUT3:LDB TEMPE BEQ LINPUT6 DEC TEMPE DEX JSR BS0 BRA LINPUT1 LINPUT4:LDB TEMPE BEQ LINPUT6 LINPUT5:DEX JSR BS0 DEC TEMPE BNE LINPUT5 BRA LINPUT1 LINPUT6:LDA #7 JSR CHROUT BRA LINPUT1 LINPUT7:PSHS X JSR TESTPR BEQ LINPU10 LDX P1 INX LDB TEMPE TSTB BEQ LINPUT9 LINPUT8:LDA ,X+ JSR PROUT DECB BNE LINPUT8 LINPUT9:LDA #$0D JSR PROUT LINPU10:PULS X LDA #$0D JSR CHROUT CLR PRTMODE LDA TEMPD CMPA TEMPE BEQ LINPU11 INC TEMPE LDA #$0D STA ,X LINPU11:LDB TEMPE RTS ENCODE: CLR SHFTLCK LDX #ENCODTO LDD #$0506 ENCODE1:STA ,X+ DECB BNE ENCODE1 LDX #ENCODFR LDY #ENCODTO LDB #6 STB ENCDLEN ENCODE2:LDA #5 LDB ,X+ BEQ ENCODE4 CLRA CMPB #$20 BEQ ENCODE4 TFR B,A JSR FNDGRP CMPA SHFTLCK BEQ ENCODE3 ADDA #3 STA ,Y+ DEC ENCDLEN BEQ ENCODE8 ENCODE3:TFR B,A JSR FNDGRP DECA TFR B,A BPL ENCODE5 SUBA #$5B ENCODE4:STA ,Y+ DEC ENCDLEN BEQ ENCODE8 BRA ENCODE2 ENCODE5:BNE ENCODE6 SUBA #$3B BRA ENCODE4 ENCODE6:CMPA #$0D BNE ENCODE7 LDA ,X CMPA #$0A BNE ENCODE7 INX LDA #7 BRA ENCODE4 ENCODE7:TFR B,A JSR GROUP2 BNE ENCODE4 LDA #6 STA ,Y+ DEC ENCDLEN BEQ ENCODE8 TFR B,A LSRA LSRA LSRA LSRA LSRA ANDA #3 STA ,Y+ DEC ENCDLEN BEQ ENCODE8 TFR B,A ANDA #$1F BRA ENCODE4 ENCODE8:LDX #ENCODTO CLRA CLRB BSR ENCODE9 BSR ENCODE9 BSR ENCODE9 STD ENCODTO LDD #1 BSR ENCODE9 BSR ENCODE9 BSR ENCODE9 STD ENCODTO+2 RTS ENCODE9:ASLB ROLA ASLB ROLA ASLB ROLA ASLB ROLA ASLB ROLA ADDB ,X+ BCC ENCOD10 INCA ENCOD10:RTS FNDGRP: CMPA #'a BLO FNDGRP1 CMPA #'z BHI FNDGRP1 CLRA RTS FNDGRP1:CMPA #'A BLO FNDGRP2 CMPA #'Z BHI FNDGRP1 LDA #1 RTS FNDGRP2:TSTA BEQ FNDGRP3 BMI FNDGRP3 LDA #2 FNDGRP3:RTS GROUP2: PSHS X,B LDX #PRTST14 LDB #$18 GROUP2A:CMPA ,-X BEQ GROUP2B DECB BNE GROUP2A PULS B,X,PC GROUP2B:TFR B,A ADDA #7 PULS B,X,PC WSEARCH:LDX DATPTR LDD 8,X LEAX D,X LDA ,X+ LEAX A,X LDB ,X+ ASLB ASLB ASLB ASLB STB WORDLEN LDD ,X++ STD WORDCNT BRA WSRCH2 WSRCH1: PSHS A LDA ,X CMPA ENCODTO PULS A BHS WSRCH3 STD WORDCNT WSRCH2: LDB WORDLEN ABX LDD WORDCNT SUBD #16 BHI WSRCH1 WSRCH3: LDB WORDLEN NEGB LEAX B,X NEGB LSRB LSRB LSRB LSRB STB WORDLEN LDY #ENCODTO WSRCH4: CLRB WSRCH5: LDA B,Y CMPA B,X BLO WSRCH7 BNE WSRCH6 INCB CMPB #4 BNE WSRCH5 TFR X,D SUBD DATPTR RTS WSRCH6: LDB WORDLEN ABX LDD WORDCNT SUBD #1 STD WORDCNT BNE WSRCH4 WSRCH7: CLRA CLRB RTS DETACH: LDA P1+1 JSR ITEMA TFR X,Y LDA 4,X BEQ DETACH0 JSR ITEMA LDA 6,X CMPA P1+1 BNE DETACH1 LDA 5,Y STA 6,X BRA DETACH2 DETACH1:JSR ITEMA LDA 5,X CMPA P1+1 BNE DETACH1 LDA 5,Y STA 5,X DETACH2:CLR 4,Y CLR 5,Y DETACH0:RTS VIDINV: CMPA #$80 BHS VIDINV1 EORA #$40 RTS VIDINV1:EORA #$0F RTS ERABS: CMPX #$0420 BEQ VIDRTS DEX DEC CURCOL BPL ERABS1 LDA #31 STA CURCOL ERABS1: LDA #$60 STA ,X BRA VIDRTSX VIDOUT: PSHS X,D LDX CURPOS LDA ,X BSR VIDINV STA ,X LDA ,S LDB LCASE BEQ VIDOUT0 TFR A,B ANDB #$5F CMPB #$3F BLO VIDOUT0 CMPB #$5B BHS VIDOUT0 EORA #$20 VIDOUT0:CMPA #$20 BHS VIDOUT1 CMPA #7 BEQ BELL CMPA #8 BEQ BS CMPA #9 BEQ TAB CMPA #12 BEQ CLS CMPA #13 BEQ CR CMPA #$18 BEQ ERABS CMPA #27 BEQ CLS VIDRTSX:STX CURPOS VIDRTS: LDX CURPOS LDA ,X BSR VIDINV STA ,X PULS D,X,PC BELL: JSR BEEP BRA VIDRTS BS: LDA CURCOL BEQ VIDRTS DEC CURCOL CMPA #32 BEQ BS1 DEX BS1: BRA VIDRTSX TAB: LDA CURCOL CMPA #31 BHI VIDRTS BEQ TAB1 INX TAB1: INC CURCOL BRA VIDRTSX CLS: LDA #$60 LDX #$0420 STX CURPOS CLR CURCOL CLS1: STA ,X+ CMPX #$05FF BLS CLS1 BRA VIDRTS CR: BSR CR0 BRA VIDRTS CR0: PSHS X,D CLR CURCOL LDX CURPOS CMPX #$05E0 BLO CR1 BSR SCROLL LDX #$05E0 STX CURPOS PULS D,X,PC CR1: LDD CURPOS ANDB #$E0 ADDD #32 STD CURPOS PULS D,X,PC VIDOUT1:LDB CURCOL CMPB #32 BNE VIDOUT2 BSR CR0 LDX CURPOS CLRB VIDOUT2:INCB BSR ASC2SCR STA ,X+ CMPB #32 BNE VIDOUT3 DEX VIDOUT3:STB CURCOL BRA VIDRTSX SCROLL: LDX #$0440 SCROLL1:LDA ,X+ STA -33,X CMPX #$05FF BLS SCROLL1 LDD #$6020 SCROLL2:STA ,-X DECB BNE SCROLL2 RTS ASC2SCR:PSHS B CMPA #$80 BHS CHROK LDB #$20 CMPA #$20 BLO XORCHR LDB #$40 CMPA #$40 BLO XORCHR LDB #$60 CMPA #$60 BLO CHROK XORCHR: STB ,-S EORA ,S+ CHROK: PULS B,PC DSP4HEX:PSHS X LDA ,S BSR DSP2HEX LDA 1,S BSR DSP2HEX PULS X,PC DSP2HEX:PSHS A RORA RORA RORA RORA BSR DSP1HEX PULS A DSP1HEX:ANDA #$0F ADDA #'0 CMPA #'9 BLS INVHEX ADDA #'A-'9-1 INVHEX: BITB #1 BNE DSPCHR EORA #$20 DSPCHR: BSR ASC2SCR STA ,U+ RTS DSPSTR1:BSR DSPCHR DSPSTR: LDA ,X+ BNE DSPSTR1 RTS BLINK: LDB #$20 PSHS U BLINK1: LDA ,U JSR VIDINV STA ,U+ DECB BNE BLINK1 PULS U JSR POLCAT1 BNE DSPSTR1 LDX #$6000 BLINK2: DEX BNE BLINK2 BRA BLINK DSKCON: PSHS U,Y,X,D LDA #5 PSHS A DSK0: CLR $0985 LDB DDRIVE LDX #DSK22 LDA $0986 ANDA #$A8 ORA B,X ORA #$20 LDB DTRACK CMPB #22 BCS DSK1 ORA #$10 DSK1: TFR A,B ORA #8 STA $0986 STA $FF40 BITB #8 BNE DSK2 JSR DSK23 DSK2: BSR DSK7 BNE DSK3 CLR DSTATUS LDX #DSK21 LDB DFUNC ASLB JSR [B,X] DSK3: PULS A LDB DSTATUS BEQ DSK4 DECA BEQ DSK4 PSHS A BSR DSK5 BNE DSK3 BRA DSK0 DSK4: LDA #255 STA $0985 PULS D,X,Y,U,PC DSK5: LDX #$097E LDB DDRIVE CLR B,X CLRA ADDA STEP STA $FF48 EXG A,A EXG A,A BSR DSK7 BSR DSK10 ANDA #$10 STA DSTATUS DSK6: RTS DSK7: LDX ZERCON DSK8: DEX BEQ DSK9 LDA $FF48 BITA #1 BNE DSK8 RTS DSK9: LDA #$D0 STA $FF48 EXG A,A EXG A,A LDA $FF48 LDA #$80 STA DSTATUS RTS DSK10: LDX #$0800 DSK11: DEX BNE DSK11 RTS DSKRD: LDA #$80 FCB $8C cmpx DSKWR: LDA #$A0 PSHS A LDX #$097E LDB DDRIVE ABX LDB ,X STB $FF49 CMPB DTRACK BEQ DSK13 LDA DTRACK STA $FF4B STA ,X LDA #$14 ADDA STEP STA $FF48 EXG A,A EXG A,A BSR DSK7 BNE DSK12 BSR DSK10 ANDA #$18 BEQ DSK13 STA DSTATUS DSK12: PULS A,PC DSK13: LDA DSECTOR STA $FF4A LDX #DSK20 STX $0983 LDX DBUFFER LDA $FF48 LDA $0986 ORA #$80 PULS B LDY ZERCON LDU #$FF48 COM $0982 ORCC #$50 STB $FF48 EXG A,A EXG A,A CMPB #$80 BEQ DSK17 LDB #2 DSK14: BITB ,U BNE DSK16 LEAY -1,Y BNE DSK14 DSK15: CLR $0982 ANDCC #$AF JMP DSK9 DSK16: LDB ,X+ STB $FF48 STA $FF40 BRA DSK16 DSK17: LDB #2 DSK18: BITB ,U BNE DSK19 LEAY -1,Y BNE DSK18 BRA DSK15 DSK19: LDB $FF4B STB ,X+ STA $FF40 BRA DSK19 DSK20: ANDCC #$AF LDA $FF48 ANDA #$7C STA DSTATUS RTS DSK21: FDB DSK5 FDB DSK6 FDB DSKRD FDB DSKWR DSK22: FCB 1,2,4,$40 DSK23: LDX ZERCON DSK24: DEX BNE DSK24 RTS NMI: LDA $0982 BEQ NMI1 LDX $0983 STX 10,S CLR $0982 NMI1: RTI IRQ: LDA $FF03 BPL RTI LDA $FF02 LDA $0985 BEQ RTI DEC $0985 BNE RTI LDA $0986 ANDA #$B0 STA $0986 STA $FF40 RTI: RTI RESET: NOP STA $FFDF CLR $0982 CLR $0985 CLR $0986 CLR $FF40 LDA #$D0 STA $FF48 EXG A,A EXG A,A LDA $FF48 LDA #$FB STA $FF02 LDA $FF00 ASLA CMPA #$7E BEQ RESET1 LDA $FF03 ORA #1 STA $FF03 SWI JMP START RESET1: CLR $71 STA $FFDE JMP [$FFFE] BEEP: LDD BEEPVAL STD DLY1 LDX #$FF00 LDA 1,X ANDA #$F7 STA 1,X LDA 3,X ANDA #$F7 STA 3,X LDA #8 BSR SNDEN ORCC #$50 BEEP1: BSR SNDNUL LDA #$FE BSR SOUND BSR SNDNUL LDA #2 BSR SOUND DEC DLY2 BNE BEEP1 CLRA SNDEN: STA ,-S LDA $FF23 ANDA #$F7 ORA ,S+ STA $FF23 ANDCC #$AF RTS SNDNUL: LDA #$7E SOUND: STA $FF20 LDA DLY1 SOUND1: INCA BNE SOUND1 RTS VPOUT: PSHS X,A BSR TESTPR BEQ VPOUT1 LDA ,S BSR PROUT VPOUT1: LDA ,S JSR VIDOUT PULS A,X,PC TESTPR: LDX DATPTR LDA $11,X ANDA #1 RTS PROUT: PSHS DP,D CLRB TFR B,DP STA $FFDE LDB #$FE STB $6F JSR [DEVOUT] STA $FFDF PULS D,DP,PC END: END START