; 1: const iobuffer = $0800 ; iobuffer = 2048 ; 2: const databuff = $0C00 ; databuff = 3072 ; 3: const autorun = $01FF ; autorun = 511 ; 4: byte version[] = "PLASMA ][ VM VERSION 0.8" D0000: ; version DB $18 DB $50,$4C,$41,$53,$4D,$41,$20,$5D DB $5B,$20,$56,$4D,$20,$56,$45,$52 DB $53,$49,$4F,$4E,$20,$30,$2E,$38 ; 5: byte errorstr[] = "ERROR: $" D0025: ; errorstr DB $08 DB $45,$52,$52,$4F,$52,$3A,$20,$24 ; 6: byte okstr[] = "OK" D0034: ; okstr DB $02 DB $4F,$4B ; 7: byte prefix[32] = "" D0037: ; prefix DB $00 DS $1F ; 8: byte perr D0068: DS 1 ; perr ; 9: word cmdptr D0069: DS 2 ; cmdptr ; 10: ; 11: ; ; 12: ; Utility functions ; 13: ; ; 14: ; CALL PRODOS ; 15: ; SYSCALL(CMD, PARAMS) ; 16: ; ; 17: asm prodos C0000: ; prodos() ; 18: LDA ESTKL,X LDA ESTKL,X ; 19: LDY ESTKH,X LDY ESTKH,X ; 20: STA PARAMS STA PARAMS ; 21: STY PARAMS+1 STY PARAMS+1 ; 22: INX INX ; 23: LDA ESTKL,X LDA ESTKL,X ; 24: STA CMD STA CMD ; 25: STX ESP STX ESP ; 26: JSR $BF00 JSR $BF00 ; 27: CMD: DB 00 CMD: DB 00 ; 28: PARAMS: DW 0000 PARAMS: DW 0000 ; 29: BIT LCBNK2 BIT LCBNK2 ; 30: LDX ESP LDX ESP ; 31: STA ESTKL,X STA ESTKL,X ; 32: LDY #$00 LDY #$00 ; 33: STY ESTKH,X STY ESTKH,X ; 34: end RTS ; 35: ; ; 36: ; CALL LOADED SYSTEM PROGRAM ; 37: ; ; 38: asm exec C0002: ; exec() ; 39: LDX #$FF LDX #$FF ; 40: TXS TXS ; 41: BIT ROMIN BIT ROMIN ; 42: JMP $2000 JMP $2000 ; 43: end RTS ; 44: ; ; 45: ; SET MEMORY TO 0 ; 46: ; MEMCLR(ADDR, SIZE) ; 47: ; ; 48: asm memclr C0004: ; memclr() ; 49: LDY #$00 LDY #$00 ; 50: LDA ESTKL+1,X LDA ESTKL+1,X ; 51: STA DSTL STA DSTL ; 52: LDA ESTKH+1,X LDA ESTKH+1,X ; 53: STA DSTH STA DSTH ; 54: INC ESTKL,X INC ESTKL,X ; 55: INC ESTKH,X INC ESTKH,X ; 56: TYA TYA ; 57: SETMLP: DEC ESTKL,X SETMLP: DEC ESTKL,X ; 58: BNE :+ BNE :+ ; 59: DEC ESTKH,X DEC ESTKH,X ; 60: BEQ :++ BEQ :++ ; 61: : STA (DST),Y : STA (DST),Y ; 62: INY INY ; 63: BNE SETMLP BNE SETMLP ; 64: INC DSTH INC DSTH ; 65: BNE SETMLP BNE SETMLP ; 66: : INX : INX ; 67: INX INX ; 68: end RTS ; 69: ; ; 70: ; COPY MEMORY ; 71: ; MEMCPY(SRCADDR, DSTADDR, SIZE) ; 72: ; ; 73: asm memcpy C0006: ; memcpy() ; 74: LDY #$00 LDY #$00 ; 75: LDA ESTKL,X LDA ESTKL,X ; 76: BNE :+ BNE :+ ; 77: LDA ESTKH,X LDA ESTKH,X ; 78: BEQ MEMEXIT BEQ MEMEXIT ; 79: : LDA ESTKL+1,X : LDA ESTKL+1,X ; 80: STA DSTL STA DSTL ; 81: LDA ESTKH+1,X LDA ESTKH+1,X ; 82: STA DSTH STA DSTH ; 83: LDA ESTKL+2,X LDA ESTKL+2,X ; 84: STA SRCL STA SRCL ; 85: LDA ESTKH+2,X LDA ESTKH+2,X ; 86: STA SRCH STA SRCH ; 87: CMP DSTH CMP DSTH ; 88: BCC REVCPY BCC REVCPY ; 89: BNE FORCPY BNE FORCPY ; 90: LDA SRCL LDA SRCL ; 91: CMP DSTL CMP DSTL ; 92: BCS FORCPY BCS FORCPY ; 93: REVCPY: ; REVERSE DIRECTION COPY REVCPY: ; REVERSE DIRECTION COPY ; 94: ; CLC ; 95: LDA ESTKL,X LDA ESTKL,X ; 96: ADC DSTL ADC DSTL ; 97: STA DSTL STA DSTL ; 98: LDA ESTKH,X LDA ESTKH,X ; 99: ADC DSTH ADC DSTH ; 100: STA DSTH STA DSTH ; 101: CLC CLC ; 102: LDA ESTKL,X LDA ESTKL,X ; 103: ADC SRCL ADC SRCL ; 104: STA SRCL STA SRCL ; 105: LDA ESTKH,X LDA ESTKH,X ; 106: ADC SRCH ADC SRCH ; 107: STA SRCH STA SRCH ; 108: INC ESTKH,X INC ESTKH,X ; 109: REVCPYLP: REVCPYLP: ; 110: LDA DSTL LDA DSTL ; 111: BNE :+ BNE :+ ; 112: DEC DSTH DEC DSTH ; 113: : DEC DSTL : DEC DSTL ; 114: LDA SRCL LDA SRCL ; 115: BNE :+ BNE :+ ; 116: DEC SRCH DEC SRCH ; 117: : DEC SRCL : DEC SRCL ; 118: LDA (SRC),Y LDA (SRC),Y ; 119: STA (DST),Y STA (DST),Y ; 120: DEC ESTKL,X DEC ESTKL,X ; 121: BNE REVCPYLP BNE REVCPYLP ; 122: DEC ESTKH,X DEC ESTKH,X ; 123: BNE REVCPYLP BNE REVCPYLP ; 124: BEQ MEMEXIT BEQ MEMEXIT ; 125: FORCPY: INC ESTKH,X FORCPY: INC ESTKH,X ; 126: FORCPYLP: FORCPYLP: ; 127: LDA (SRC),Y LDA (SRC),Y ; 128: STA (DST),Y STA (DST),Y ; 129: INC DSTL INC DSTL ; 130: BNE :+ BNE :+ ; 131: INC DSTH INC DSTH ; 132: : INC SRCL : INC SRCL ; 133: BNE :+ BNE :+ ; 134: INC SRCH INC SRCH ; 135: : DEC ESTKL,X : DEC ESTKL,X ; 136: BNE FORCPYLP BNE FORCPYLP ; 137: DEC ESTKH,X DEC ESTKH,X ; 138: BNE FORCPYLP BNE FORCPYLP ; 139: MEMEXIT: INX MEMEXIT: INX ; 140: INX INX ; 141: INX INX ; 142: end RTS ; 143: ; ; 144: ; CHAR OUT ; 145: ; COUT(CHAR) ; 146: ; ; 147: asm cout C0008: ; cout() ; 148: LDA ESTKL,X LDA ESTKL,X ; 149: INX INX ; 150: ORA #$80 ORA #$80 ; 151: BIT ROMIN BIT ROMIN ; 152: JSR $FDED JSR $FDED ; 153: BIT LCBNK2 BIT LCBNK2 ; 154: end RTS ; 155: ; ; 156: ; CHAR IN ; 157: ; RDKEY() ; 158: ; ; 159: asm cin C0010: ; cin() ; 160: BIT ROMIN BIT ROMIN ; 161: STX ESP STX ESP ; 162: JSR $FD0C JSR $FD0C ; 163: LDX ESP LDX ESP ; 164: BIT LCBNK2 BIT LCBNK2 ; 165: DEX DEX ; 166: STA ESTKL,X STA ESTKL,X ; 167: LDY #$00 LDY #$00 ; 168: STY ESTKH,X STY ESTKH,X ; 169: end RTS ; 170: ; ; 171: ; PRINT STRING ; 172: ; PRSTR(STR) ; 173: ; ; 174: asm prstr C0012: ; prstr() ; 175: LDY #$00 LDY #$00 ; 176: LDA ESTKL,X LDA ESTKL,X ; 177: STA SRCL STA SRCL ; 178: LDA ESTKH,X LDA ESTKH,X ; 179: STA SRCH STA SRCH ; 180: BIT ROMIN BIT ROMIN ; 181: LDA (SRC),Y LDA (SRC),Y ; 182: STA ESTKL,X STA ESTKL,X ; 183: BEQ :+ BEQ :+ ; 184: _PRS1: INY _PRS1: INY ; 185: LDA (SRC),Y LDA (SRC),Y ; 186: ORA #$80 ORA #$80 ; 187: JSR $FDED JSR $FDED ; 188: TYA TYA ; 189: CMP ESTKL,X CMP ESTKL,X ; 190: BNE _PRS1 BNE _PRS1 ; 191: : INX : INX ; 192: BIT LCBNK2 BIT LCBNK2 ; 193: end RTS ; 194: ; ; 195: ; PRINT BYTE ; 196: ; ; 197: asm prbyte C0014: ; prbyte() ; 198: LDA ESTKL,X LDA ESTKL,X ; 199: INX INX ; 200: STX ESP STX ESP ; 201: BIT ROMIN BIT ROMIN ; 202: JSR $FDDA JSR $FDDA ; 203: BIT LCBNK2 BIT LCBNK2 ; 204: LDX ESP LDX ESP ; 205: end RTS ; 206: ; ; 207: ; READ STRING ; 208: ; STR = RDSTR(PROMPTCHAR) ; 209: ; ; 210: asm rdstr C0016: ; rdstr() ; 211: LDA ESTKL,X LDA ESTKL,X ; 212: STA $33 STA $33 ; 213: STX ESP STX ESP ; 214: BIT ROMIN BIT ROMIN ; 215: JSR $FD6A JSR $FD6A ; 216: BIT LCBNK2 BIT LCBNK2 ; 217: STX $01FF STX $01FF ; 218: : LDA $01FF,X : LDA $01FF,X ; 219: AND #$7F AND #$7F ; 220: STA $01FF,X STA $01FF,X ; 221: DEX DEX ; 222: BPL :- BPL :- ; 223: LDX ESP LDX ESP ; 224: LDA #$FF LDA #$FF ; 225: STA ESTKL,X STA ESTKL,X ; 226: LDA #$01 LDA #$01 ; 227: STA ESTKH,X STA ESTKH,X ; 228: end RTS ; 229: asm toupper C0018: ; toupper() ; 230: LDA ESTKL,X LDA ESTKL,X ; 231: CMP #'a' CMP #'a' ; 232: BCC :+ BCC :+ ; 233: CMP #'z'+1 CMP #'z'+1 ; 234: BCS :+ BCS :+ ; 235: SEC SEC ; 236: SBC #$20 SBC #$20 ; 237: STA ESTKL,X STA ESTKL,X ; 238: : : ; 239: end RTS ; 240: ; ; 241: ; EXIT ; 242: ; ; 243: asm reboot C0020: ; reboot() ; 244: BIT ROMIN BIT ROMIN ; 245: LDA #$00 LDA #$00 ; 246: STA $3F4 ; INVALIDATE POWER-UP BYTE STA $3F4 ; INVALIDATE POWER-UP BYTE ; 247: JMP ($FFFC) ; RESET JMP ($FFFC) ; RESET ; 248: end RTS ; 249: def crout C0022: ; crout() ; 250: cout($0D) JSR INTERP DB $2A,$0D ; CB 13 DB $54,C0008 ; CALL C0008 ; 251: end DB $5C ; RET ; 252: ; ; 253: ; ProDOS routines ; 254: ; ; 255: def getpfx(path) C0024: ; getpfx() ; path = 2 ; 256: byte params[3] ; params = 4 ; 257: ; 258: ^path = 0 JSR INTERP DB $58,$07,$01 ; ENTER 7,1 DB $66,$02 ; LLW 2 DB $00 ; ZERO DB $70 ; SB ; 259: params.0 = 1 DB $28,$04 ; LLA 4 DB $2A,$01 ; CB 1 DB $70 ; SB ; 260: params:1 = path DB $28,$05 ; LLA 5 DB $66,$02 ; LLW 2 DB $72 ; SW ; 261: perr = prodos($C7, @params) DB $2A,$C7 ; CB 199 DB $28,$04 ; LLA 4 DB $54,C0000 ; CALL C0000 DB $78,D0068 ; SAB D0068 ; 262: return path DB $66,$02 ; LLW 2 DB $5A ; LEAVE ; 263: end ; 264: def setpfx(path) C0026: ; setpfx() ; path = 2 ; 265: byte params[3] ; params = 4 ; 266: ; 267: params.0 = 1 JSR INTERP DB $58,$07,$01 ; ENTER 7,1 DB $28,$04 ; LLA 4 DB $2A,$01 ; CB 1 DB $70 ; SB ; 268: params:1 = path DB $28,$05 ; LLA 5 DB $66,$02 ; LLW 2 DB $72 ; SW ; 269: perr = prodos($C6, @params) DB $2A,$C6 ; CB 198 DB $28,$04 ; LLA 4 DB $54,C0000 ; CALL C0000 DB $78,D0068 ; SAB D0068 ; 270: return path DB $66,$02 ; LLW 2 DB $5A ; LEAVE ; 271: end ; 272: def online C0028: ; online() ; 273: byte params[4] ; params = 2 ; 274: ; 275: params.0 = 2 JSR INTERP DB $58,$06,$00 ; ENTER 6,0 DB $28,$02 ; LLA 2 DB $2A,$02 ; CB 2 DB $70 ; SB ; 276: params.1 = 0 DB $28,$03 ; LLA 3 DB $00 ; ZERO DB $70 ; SB ; 277: params:2 = $2000 DB $28,$04 ; LLA 4 DB $2C,$00,$20 ; CW 8192 DB $72 ; SW ; 278: perr = prodos($C5, @params) DB $2A,$C5 ; CB 197 DB $28,$02 ; LLA 2 DB $54,C0000 ; CALL C0000 DB $78,D0068 ; SAB D0068 ; 279: return $2000 DB $2C,$00,$20 ; CW 8192 DB $5A ; LEAVE ; 280: end ; 281: def open(path, buff) C0030: ; open() ; path = 2 ; buff = 4 ; 282: byte params[6] ; params = 6 ; 283: ; 284: params.0 = 3 JSR INTERP DB $58,$0C,$02 ; ENTER 12,2 DB $28,$06 ; LLA 6 DB $2A,$03 ; CB 3 DB $70 ; SB ; 285: params:1 = path DB $28,$07 ; LLA 7 DB $66,$02 ; LLW 2 DB $72 ; SW ; 286: params:3 = buff DB $28,$09 ; LLA 9 DB $66,$04 ; LLW 4 DB $72 ; SW ; 287: params.5 = 0 DB $28,$0B ; LLA 11 DB $00 ; ZERO DB $70 ; SB ; 288: perr = prodos($C8, @params) DB $2A,$C8 ; CB 200 DB $28,$06 ; LLA 6 DB $54,C0000 ; CALL C0000 DB $78,D0068 ; SAB D0068 ; 289: return params.5 DB $28,$0B ; LLA 11 DB $60 ; LB DB $5A ; LEAVE ; 290: end ; 291: def close(refnum) C0032: ; close() ; refnum = 2 ; 292: byte params[2] ; params = 4 ; 293: ; 294: params.0 = 1 JSR INTERP DB $58,$06,$01 ; ENTER 6,1 DB $28,$04 ; LLA 4 DB $2A,$01 ; CB 1 DB $70 ; SB ; 295: params.1 = refnum DB $28,$05 ; LLA 5 DB $66,$02 ; LLW 2 DB $70 ; SB ; 296: perr = prodos($CC, @params) DB $2A,$CC ; CB 204 DB $28,$04 ; LLA 4 DB $54,C0000 ; CALL C0000 DB $78,D0068 ; SAB D0068 ; 297: return perr DB $68,D0068 ; LAB D0068 DB $5A ; LEAVE ; 298: end ; 299: def read(refnum, buff, len) C0034: ; read() ; refnum = 2 ; buff = 4 ; len = 6 ; 300: byte params[8] ; params = 8 ; 301: ; 302: params.0 = 4 JSR INTERP DB $58,$10,$03 ; ENTER 16,3 DB $28,$08 ; LLA 8 DB $2A,$04 ; CB 4 DB $70 ; SB ; 303: params.1 = refnum DB $28,$09 ; LLA 9 DB $66,$02 ; LLW 2 DB $70 ; SB ; 304: params:2 = buff DB $28,$0A ; LLA 10 DB $66,$04 ; LLW 4 DB $72 ; SW ; 305: params:4 = len DB $28,$0C ; LLA 12 DB $66,$06 ; LLW 6 DB $72 ; SW ; 306: params:6 = 0 DB $28,$0E ; LLA 14 DB $00 ; ZERO DB $72 ; SW ; 307: perr = prodos($CA, @params) DB $2A,$CA ; CB 202 DB $28,$08 ; LLA 8 DB $54,C0000 ; CALL C0000 DB $78,D0068 ; SAB D0068 ; 308: return params:6 DB $28,$0E ; LLA 14 DB $62 ; LW DB $5A ; LEAVE ; 309: end ; 310: ; ; 311: ; Command mode ; 312: ; ; 313: def volumes C0036: ; volumes() ; 314: word strbuf ; strbuf = 2 ; 315: byte i ; i = 4 ; 316: ; 317: strbuf = online() JSR INTERP DB $58,$05,$00 ; ENTER 5,0 DB $54,C0028 ; CALL C0028 DB $76,$02 ; SLW 2 ; 318: for i = 0 to 15 DB $00 ; ZERO C0039: DB $6C,$04 ; DLB 4 DB $2A,$0F ; CB 15 DB $3A,C0038 ; SKPGT C0038 DB $0C ; INCR ; 319: ^strbuf = ^strbuf & $0F DB $66,$02 ; LLW 2 DB $66,$02 ; LLW 2 DB $60 ; LB DB $2A,$0F ; CB 15 DB $14 ; BAND DB $70 ; SB ; 320: if ^strbuf DB $66,$02 ; LLW 2 DB $60 ; LB DB $4C,C0040 ; SKPFLS C0040 ; 321: cout('/') DB $2A,$2F ; CB 47 DB $54,C0008 ; CALL C0008 ; 322: prstr(strbuf) DB $66,$02 ; LLW 2 DB $54,C0012 ; CALL C0012 ; 323: crout() DB $54,C0022 ; CALL C0022 ; 324: fin C0040: C0041: ; 325: strbuf = strbuf + 16 DB $66,$02 ; LLW 2 DB $2A,$10 ; CB 16 DB $02 ; ADD DB $76,$02 ; SLW 2 ; 326: next DB $50,C0039 ; SKIP C0039 C0038: DB $30 ; DROP ; 327: end DB $5A ; LEAVE ; 328: def catalog(optpath) C0042: ; catalog() ; optpath = 2 ; 329: byte path[64] ; path = 4 ; 330: byte refnum ; refnum = 68 ; 331: byte firstblk ; firstblk = 69 ; 332: byte entrylen, entriesblk ; entrylen = 70 ; entriesblk = 71 ; 333: byte i, type, len ; i = 72 ; type = 73 ; len = 74 ; 334: word entry, filecnt ; entry = 75 ; filecnt = 77 ; 335: ; 336: if ^optpath JSR INTERP DB $58,$4F,$01 ; ENTER 79,1 DB $66,$02 ; LLW 2 DB $60 ; LB DB $4C,C0044 ; SKPFLS C0044 ; 337: memcpy(optpath, @path, ^optpath + 1) DB $66,$02 ; LLW 2 DB $28,$04 ; LLA 4 DB $66,$02 ; LLW 2 DB $60 ; LB DB $2A,$01 ; CB 1 DB $02 ; ADD DB $54,C0006 ; CALL C0006 ; 338: else DB $50,C0045 ; SKIP C0045 C0044: ; 339: drop getpfx(@path) DB $28,$04 ; LLA 4 DB $54,C0024 ; CALL C0024 DB $30 ; DROP ; 340: prstr(@path) DB $28,$04 ; LLA 4 DB $54,C0012 ; CALL C0012 ; 341: crout() DB $54,C0022 ; CALL C0022 ; 342: fin C0045: ; 343: refnum = open(@path, iobuffer); DB $28,$04 ; LLA 4 DB $2C,$00,$08 ; CW 2048 DB $54,C0030 ; CALL C0030 DB $74,$44 ; SLB 68 ; 344: if perr DB $68,D0068 ; LAB D0068 DB $4C,C0046 ; SKPFLS C0046 ; 345: return perr DB $68,D0068 ; LAB D0068 DB $5A ; LEAVE ; 346: fin C0046: C0047: ; 347: firstblk = 1 DB $2A,$01 ; CB 1 DB $74,$45 ; SLB 69 ; 348: repeat C0049: ; 349: if read(refnum, databuff, 512) == 512 DB $64,$44 ; LLB 68 DB $2C,$00,$0C ; CW 3072 DB $2C,$00,$02 ; CW 512 DB $54,C0034 ; CALL C0034 DB $2C,$00,$02 ; CW 512 DB $40 ; ISEQ DB $4C,C0050 ; SKPFLS C0050 ; 350: entry = databuff + 4 DB $2C,$00,$0C ; CW 3072 DB $2A,$04 ; CB 4 DB $02 ; ADD DB $76,$4B ; SLW 75 ; 351: if firstblk DB $64,$45 ; LLB 69 DB $4C,C0052 ; SKPFLS C0052 ; 352: entrylen = databuff.$23 DB $2C,$23,$0C ; CW 3107 DB $60 ; LB DB $74,$46 ; SLB 70 ; 353: entriesblk = databuff.$24 DB $2C,$24,$0C ; CW 3108 DB $60 ; LB DB $74,$47 ; SLB 71 ; 354: filecnt = databuff:$25 DB $2C,$25,$0C ; CW 3109 DB $62 ; LW DB $76,$4D ; SLW 77 ; 355: entry = entry + entrylen DB $66,$4B ; LLW 75 DB $64,$46 ; LLB 70 DB $02 ; ADD DB $76,$4B ; SLW 75 ; 356: fin C0052: C0053: ; 357: for i = firstblk to entriesblk DB $64,$45 ; LLB 69 C0055: DB $6C,$48 ; DLB 72 DB $64,$47 ; LLB 71 DB $3A,C0054 ; SKPGT C0054 DB $0C ; INCR ; 358: type = ^entry DB $66,$4B ; LLW 75 DB $60 ; LB DB $74,$49 ; SLB 73 ; 359: if type <> 0 DB $64,$49 ; LLB 73 DB $00 ; ZERO DB $42 ; ISNE DB $4C,C0056 ; SKPFLS C0056 ; 360: len = type & $0F DB $64,$49 ; LLB 73 DB $2A,$0F ; CB 15 DB $14 ; BAND DB $74,$4A ; SLB 74 ; 361: ^entry = len DB $66,$4B ; LLW 75 DB $64,$4A ; LLB 74 DB $70 ; SB ; 362: prstr(entry) DB $66,$4B ; LLW 75 DB $54,C0012 ; CALL C0012 ; 363: if type & $F0 == $D0 ; Is it a directory? DB $64,$49 ; LLB 73 DB $2A,$F0 ; CB 240 DB $14 ; BAND DB $2A,$D0 ; CB 208 DB $40 ; ISEQ DB $4C,C0058 ; SKPFLS C0058 ; 364: cout('/') DB $2A,$2F ; CB 47 DB $54,C0008 ; CALL C0008 ; 365: len = len + 1 DB $64,$4A ; LLB 74 DB $2A,$01 ; CB 1 DB $02 ; ADD DB $74,$4A ; SLB 74 ; 366: elsif (entry).$10 == $FF DB $50,C0059 ; SKIP C0059 C0058: DB $66,$4B ; LLW 75 DB $2A,$10 ; CB 16 DB $02 ; ADD DB $60 ; LB DB $2A,$FF ; CB 255 DB $40 ; ISEQ DB $4C,C0060 ; SKPFLS C0060 ; 367: cout('*') DB $2A,$2A ; CB 42 DB $54,C0008 ; CALL C0008 ; 368: len = len + 1 DB $64,$4A ; LLB 74 DB $2A,$01 ; CB 1 DB $02 ; ADD DB $74,$4A ; SLB 74 ; 369: fin C0060: C0059: ; 370: for len = 19 - len downto 0 DB $2A,$13 ; CB 19 DB $64,$4A ; LLB 74 DB $04 ; SUB C0062: DB $6C,$4A ; DLB 74 DB $00 ; ZERO DB $38,C0061 ; SKPLT C0061 DB $0E ; DECR ; 371: cout(' ') DB $2A,$20 ; CB 32 DB $54,C0008 ; CALL C0008 ; 372: next DB $50,C0062 ; SKIP C0062 C0061: DB $30 ; DROP ; 373: filecnt = filecnt - 1 DB $66,$4D ; LLW 77 DB $2A,$01 ; CB 1 DB $04 ; SUB DB $76,$4D ; SLW 77 ; 374: fin C0056: C0057: ; 375: entry = entry + entrylen DB $66,$4B ; LLW 75 DB $64,$46 ; LLB 70 DB $02 ; ADD DB $76,$4B ; SLW 75 ; 376: next DB $50,C0055 ; SKIP C0055 C0054: DB $30 ; DROP ; 377: firstblk = 0 DB $00 ; ZERO DB $74,$45 ; SLB 69 ; 378: else DB $50,C0051 ; SKIP C0051 C0050: ; 379: filecnt = 0 DB $00 ; ZERO DB $76,$4D ; SLW 77 ; 380: fin C0051: ; 381: until filecnt == 0 DB $66,$4D ; LLW 77 DB $00 ; ZERO DB $40 ; ISEQ DB $4C,C0049 ; SKPFLS C0049 C0048: ; 382: drop close(refnum) DB $64,$44 ; LLB 68 DB $54,C0032 ; CALL C0032 DB $30 ; DROP ; 383: crout() DB $54,C0022 ; CALL C0022 ; 384: return 0 DB $00 ; ZERO DB $5A ; LEAVE ; 385: end ; 386: def stripchars(strptr) C0063: ; stripchars() ; strptr = 2 ; 387: while ^strptr and ^(strptr + 1) <> ' ' JSR INTERP DB $58,$04,$01 ; ENTER 4,1 C0065: DB $66,$02 ; LLW 2 DB $60 ; LB DB $66,$02 ; LLW 2 DB $2A,$01 ; CB 1 DB $02 ; ADD DB $60 ; LB DB $2A,$20 ; CB 32 DB $42 ; ISNE DB $24 ; LAND DB $4C,C0066 ; SKPFLS C0066 ; 388: memcpy(strptr + 2, strptr + 1, ^strptr) DB $66,$02 ; LLW 2 DB $2A,$02 ; CB 2 DB $02 ; ADD DB $66,$02 ; LLW 2 DB $2A,$01 ; CB 1 DB $02 ; ADD DB $66,$02 ; LLW 2 DB $60 ; LB DB $54,C0006 ; CALL C0006 ; 389: ^strptr = ^strptr - 1 DB $66,$02 ; LLW 2 DB $66,$02 ; LLW 2 DB $60 ; LB DB $2A,$01 ; CB 1 DB $04 ; SUB DB $70 ; SB ; 390: loop DB $50,C0065 ; SKIP C0065 C0066: ; 391: return ^strptr DB $66,$02 ; LLW 2 DB $60 ; LB DB $5A ; LEAVE ; 392: end ; 393: def stripspaces(strptr) C0067: ; stripspaces() ; strptr = 2 ; 394: while ^strptr and ^(strptr + ^strptr) <= ' ' JSR INTERP DB $58,$04,$01 ; ENTER 4,1 C0069: DB $66,$02 ; LLW 2 DB $60 ; LB DB $66,$02 ; LLW 2 DB $66,$02 ; LLW 2 DB $60 ; LB DB $02 ; ADD DB $60 ; LB DB $2A,$20 ; CB 32 DB $4A ; ISLE DB $24 ; LAND DB $4C,C0070 ; SKPFLS C0070 ; 395: ^strptr = ^strptr - 1 DB $66,$02 ; LLW 2 DB $66,$02 ; LLW 2 DB $60 ; LB DB $2A,$01 ; CB 1 DB $04 ; SUB DB $70 ; SB ; 396: loop DB $50,C0069 ; SKIP C0069 C0070: ; 397: while ^strptr and ^(strptr + 1) <= ' ' C0071: DB $66,$02 ; LLW 2 DB $60 ; LB DB $66,$02 ; LLW 2 DB $2A,$01 ; CB 1 DB $02 ; ADD DB $60 ; LB DB $2A,$20 ; CB 32 DB $4A ; ISLE DB $24 ; LAND DB $4C,C0072 ; SKPFLS C0072 ; 398: memcpy(strptr + 2, strptr + 1, ^strptr) DB $66,$02 ; LLW 2 DB $2A,$02 ; CB 2 DB $02 ; ADD DB $66,$02 ; LLW 2 DB $2A,$01 ; CB 1 DB $02 ; ADD DB $66,$02 ; LLW 2 DB $60 ; LB DB $54,C0006 ; CALL C0006 ; 399: ^strptr = ^strptr - 1 DB $66,$02 ; LLW 2 DB $66,$02 ; LLW 2 DB $60 ; LB DB $2A,$01 ; CB 1 DB $04 ; SUB DB $70 ; SB ; 400: loop DB $50,C0071 ; SKIP C0071 C0072: ; 401: end DB $5A ; LEAVE ; 402: def striptrail(strptr) C0073: ; striptrail() ; strptr = 2 ; 403: byte i ; i = 4 ; 404: ; 405: for i = 1 to ^strptr JSR INTERP DB $58,$05,$01 ; ENTER 5,1 DB $2A,$01 ; CB 1 C0076: DB $6C,$04 ; DLB 4 DB $66,$02 ; LLW 2 DB $60 ; LB DB $3A,C0075 ; SKPGT C0075 DB $0C ; INCR ; 406: if (strptr)[i] == ' ' DB $66,$02 ; LLW 2 DB $64,$04 ; LLB 4 DB $02 ; IDXB DB $60 ; LB DB $2A,$20 ; CB 32 DB $40 ; ISEQ DB $4C,C0077 ; SKPFLS C0077 ; 407: ^strptr = i - 1 DB $66,$02 ; LLW 2 DB $64,$04 ; LLB 4 DB $2A,$01 ; CB 1 DB $04 ; SUB DB $70 ; SB ; 408: return DB $30 ; DROP DB $5A ; LEAVE ; 409: fin C0077: C0078: ; 410: next DB $50,C0076 ; SKIP C0076 C0075: DB $30 ; DROP ; 411: end DB $5A ; LEAVE ; 412: def parsecmd(strptr) C0079: ; parsecmd() ; strptr = 2 ; 413: byte cmd ; cmd = 4 ; 414: ; 415: cmd = 0 JSR INTERP DB $58,$05,$01 ; ENTER 5,1 DB $00 ; ZERO DB $74,$04 ; SLB 4 ; 416: stripspaces(strptr) DB $66,$02 ; LLW 2 DB $54,C0067 ; CALL C0067 ; 417: if ^strptr DB $66,$02 ; LLW 2 DB $60 ; LB DB $4C,C0081 ; SKPFLS C0081 ; 418: cmd = ^(strptr + 1) DB $66,$02 ; LLW 2 DB $2A,$01 ; CB 1 DB $02 ; ADD DB $60 ; LB DB $74,$04 ; SLB 4 ; 419: memcpy(strptr + 2, strptr + 1, ^strptr) DB $66,$02 ; LLW 2 DB $2A,$02 ; CB 2 DB $02 ; ADD DB $66,$02 ; LLW 2 DB $2A,$01 ; CB 1 DB $02 ; ADD DB $66,$02 ; LLW 2 DB $60 ; LB DB $54,C0006 ; CALL C0006 ; 420: ^strptr = ^strptr - 1 DB $66,$02 ; LLW 2 DB $66,$02 ; LLW 2 DB $60 ; LB DB $2A,$01 ; CB 1 DB $04 ; SUB DB $70 ; SB ; 421: fin C0081: C0082: ; 422: stripspaces(strptr) DB $66,$02 ; LLW 2 DB $54,C0067 ; CALL C0067 ; 423: return cmd DB $64,$04 ; LLB 4 DB $5A ; LEAVE ; 424: end ; 425: def resetmemfiles C0083: ; resetmemfiles() ; 426: ; ; 427: ; Close all files ; 428: ; ; 429: ^$BFD8 = 0 JSR INTERP DB $2C,$D8,$BF ; CW 49112 DB $00 ; ZERO DB $70 ; SB ; 430: drop close(0) DB $00 ; ZERO DB $54,C0032 ; CALL C0032 DB $30 ; DROP ; 431: ; ; 432: ; Set memory bitmap ; 433: ; ; 434: memclr($BF58, 24) DB $2C,$58,$BF ; CW 48984 DB $2A,$18 ; CB 24 DB $54,C0004 ; CALL C0004 ; 435: ^$BF58 = $CF DB $2C,$58,$BF ; CW 48984 DB $2A,$CF ; CB 207 DB $70 ; SB ; 436: ^$BF6F = $01 DB $2C,$6F,$BF ; CW 49007 DB $2A,$01 ; CB 1 DB $70 ; SB ; 437: end DB $5C ; RET ; 438: def execsys(sysfile) C0085: ; execsys() ; sysfile = 2 ; 439: byte refnum ; refnum = 4 ; 440: word len ; len = 5 ; 441: ; 442: if ^sysfile JSR INTERP DB $58,$07,$01 ; ENTER 7,1 DB $66,$02 ; LLW 2 DB $60 ; LB DB $4C,C0087 ; SKPFLS C0087 ; 443: memcpy(sysfile, $280, ^sysfile + 1) DB $66,$02 ; LLW 2 DB $2C,$80,$02 ; CW 640 DB $66,$02 ; LLW 2 DB $60 ; LB DB $2A,$01 ; CB 1 DB $02 ; ADD DB $54,C0006 ; CALL C0006 ; 444: striptrail(sysfile) DB $66,$02 ; LLW 2 DB $54,C0073 ; CALL C0073 ; 445: refnum = open(sysfile, iobuffer) DB $66,$02 ; LLW 2 DB $2C,$00,$08 ; CW 2048 DB $54,C0030 ; CALL C0030 DB $74,$04 ; SLB 4 ; 446: if refnum DB $64,$04 ; LLB 4 DB $4C,C0089 ; SKPFLS C0089 ; 447: len = read(refnum, $2000, $FFFF) DB $64,$04 ; LLB 4 DB $2C,$00,$20 ; CW 8192 DB $2C,$FF,$FF ; CW 65535 DB $54,C0034 ; CALL C0034 DB $76,$05 ; SLW 5 ; 448: resetmemfiles() DB $54,C0083 ; CALL C0083 ; 449: if len DB $66,$05 ; LLW 5 DB $4C,C0091 ; SKPFLS C0091 ; 450: memcpy($280, sysfile, ^$280 + 1) DB $2C,$80,$02 ; CW 640 DB $66,$02 ; LLW 2 DB $2C,$80,$02 ; CW 640 DB $60 ; LB DB $2A,$01 ; CB 1 DB $02 ; ADD DB $54,C0006 ; CALL C0006 ; 451: if stripchars(sysfile) and ^$2000 == $4C and *$2003 == $EEEE DB $66,$02 ; LLW 2 DB $54,C0063 ; CALL C0063 DB $2C,$00,$20 ; CW 8192 DB $60 ; LB DB $2A,$4C ; CB 76 DB $40 ; ISEQ DB $2C,$03,$20 ; CW 8195 DB $62 ; LW DB $2C,$EE,$EE ; CW 61166 DB $40 ; ISEQ DB $24 ; LAND DB $24 ; LAND DB $4C,C0093 ; SKPFLS C0093 ; 452: stripspaces(sysfile) DB $66,$02 ; LLW 2 DB $54,C0067 ; CALL C0067 ; 453: if ^$2006 <= ^sysfile DB $2C,$06,$20 ; CW 8198 DB $60 ; LB DB $66,$02 ; LLW 2 DB $60 ; LB DB $4A ; ISLE DB $4C,C0095 ; SKPFLS C0095 ; 454: memcpy(sysfile, $2006, ^sysfile + 1) DB $66,$02 ; LLW 2 DB $2C,$06,$20 ; CW 8198 DB $66,$02 ; LLW 2 DB $60 ; LB DB $2A,$01 ; CB 1 DB $02 ; ADD DB $54,C0006 ; CALL C0006 ; 455: fin C0095: C0096: ; 456: fin C0093: C0094: ; 457: striptrail($280) DB $2C,$80,$02 ; CW 640 DB $54,C0073 ; CALL C0073 ; 458: exec() DB $54,C0002 ; CALL C0002 ; 459: fin C0091: C0092: ; 460: fin C0089: C0090: ; 461: fin C0087: C0088: ; 462: end DB $5A ; LEAVE ; 463: ; 464: resetmemfiles() START: ; JSR INTERP DB $54,C0083 ; CALL C0083 ; 465: execsys(autorun) DB $2C,$FF,$01 ; CW 511 DB $54,C0085 ; CALL C0085 ; 466: prstr(@version) DB $26,D0000 ; LA D0000 DB $54,C0012 ; CALL C0012 ; 467: crout(); DB $54,C0022 ; CALL C0022 ; 468: while 1 C0097: DB $2A,$01 ; CB 1 DB $4C,C0098 ; SKPFLS C0098 ; 469: prstr(getpfx(@prefix)) DB $26,D0037 ; LA D0037 DB $54,C0024 ; CALL C0024 DB $54,C0012 ; CALL C0012 ; 470: cmdptr = rdstr($BA) DB $2A,$BA ; CB 186 DB $54,C0016 ; CALL C0016 DB $7A,D0069 ; SAW D0069 ; 471: when toupper(parsecmd(cmdptr)) DB $6A,D0069 ; LAW D0069 DB $54,C0079 ; CALL C0079 DB $54,C0018 ; CALL C0018 ; 472: is 'Q' DB $2A,$51 ; CB 81 DB $3E,C0100 ; SKPNE C0100 ; 473: reboot() DB $54,C0020 ; CALL C0020 ; 474: is 'C' DB $50,C0099 ; SKIP C0099 C0100: DB $2A,$43 ; CB 67 DB $3E,C0101 ; SKPNE C0101 ; 475: drop catalog(cmdptr) DB $6A,D0069 ; LAW D0069 DB $54,C0042 ; CALL C0042 DB $30 ; DROP ; 476: is 'P' DB $50,C0099 ; SKIP C0099 C0101: DB $2A,$50 ; CB 80 DB $3E,C0102 ; SKPNE C0102 ; 477: drop setpfx(cmdptr) DB $6A,D0069 ; LAW D0069 DB $54,C0026 ; CALL C0026 DB $30 ; DROP ; 478: is 'V' DB $50,C0099 ; SKIP C0099 C0102: DB $2A,$56 ; CB 86 DB $3E,C0103 ; SKPNE C0103 ; 479: volumes(); DB $54,C0036 ; CALL C0036 ; 480: is '-' DB $50,C0099 ; SKIP C0099 C0103: DB $2A,$2D ; CB 45 DB $3E,C0104 ; SKPNE C0104 ; 481: execsys(cmdptr) DB $6A,D0069 ; LAW D0069 DB $54,C0085 ; CALL C0085 ; 482: perr = $46 DB $2A,$46 ; CB 70 DB $78,D0068 ; SAB D0068 ; 483: wend DB $50,C0099 ; SKIP C0099 C0104: C0099: DB $30 ; DROP ; 484: if perr DB $68,D0068 ; LAB D0068 DB $4C,C0106 ; SKPFLS C0106 ; 485: prstr(@errorstr) DB $26,D0025 ; LA D0025 DB $54,C0012 ; CALL C0012 ; 486: prbyte(perr) DB $68,D0068 ; LAB D0068 DB $54,C0014 ; CALL C0014 ; 487: else DB $50,C0107 ; SKIP C0107 C0106: ; 488: prstr(@okstr) DB $26,D0034 ; LA D0034 DB $54,C0012 ; CALL C0012 ; 489: fin C0107: ; 490: crout() DB $54,C0022 ; CALL C0022 ; 491: loop DB $50,C0097 ; SKIP C0097 C0098: ; 492: done DB $5C ; RET