\***Siege Disassembly*** \C.R.Dewhurst October 2002 \Colour codes for fully-coloured Mode 2 bytes 0B80 EQUB 0,3,12,15,48,51,60,63 0B88 EQUB 192,195,204,207,240,252,255 0B90 EQUB 7 \row counter in character plotting 0B91 EQUB 12 \text colour mask 0B92 EQUB 0,255,0,0 \screen bytes in character plotting 0B96 EQUB 20 \random number seed? 0B97 EQUW 1,31 0B99 EQUB 0 \x coordinate (char filling) 0B9A EQUB 3 \y coordinate (char filling) 0B9B EQUB 20 \x count (char fill) 0B9C EQUB 31 \y count (char fill) 0B9D EQUB 0 \current score units count 0B9E EQUB 0 \tens count 0B9F EQUB 0 \hundreds count 0BA0 EQUB 3 \thousands count 0BA1 EQUB 0 \high score units count 0BA2 EQUB 0 \tens count 0BA3 EQUB 0 \hundreds count 0BA4 EQUB 0 \thousands count 0BA5 EQUW &0E00 \base address of RAM characters \Keys pressed table. \If an entry contains &FF the key has been pressed, \if the entry is 0 the key hasn't been pressed. 0BA7 EQUB 0 \: pressed flag 0BA8 EQUB 0 \/ pressed flag 0BA9 EQUB 0 \Z pressed flag 0BAA EQUB 0 \X pressed flag 0BAB EQUB 0 \SHIFT pressed flag 0BAC EQUB 0 \S pressed flag 0BAD EQUB 16 \*** Calculate Screen Address *** \Entry: &72=x coordinate, &73=y coordinate of cell \First calculate y = y*20 0BAE LDA #0 \ Zeroise high byte of result. 0BB0 STA &78 0BB2 LDA &73 0BB4 ASL A 0BB5 ASL A \ y*4 0BB6 TAX 0BB7 ASL A 0BB8 ASL A \ y*16 0BB9 ROL &78 0BBB STA &77 0BBD TXA 0BBE CLC 0BBF ADC &77 0BC1 STA &77 \ so y=y*4+y*16=y*20 0BC3 LDA #0 0BC5 ADC &78 0BC7 STA &78 0BC9 LDA &72 \ now y=y*20+x 0BCB CLC 0BCC ADC &77 0BCE STA &77 0BD0 STA &79 0BD2 LDA #0 0BD4 ADC &78 0BD6 STA &78 0BD8 CLC 0BD9 ADC #9 \ &79/7A=&900+y*20+x 0BDB STA &7A 0BDD ASL &77 0BDF ROL &78 0BE1 ASL &77 0BE3 ROL &78 0BE5 ASL &77 0BE7 ROL &78 0BE9 ASL &77 0BEB ROL &78 0BED ASL &77 0BEF ROL &78 \ (y*20+x)*32 = y*640+x*32 0BF1 LDA #&30 \ +&3000 0BF3 CLC 0BF4 ADC &78 0BF6 STA &78 0BF8 RTS \ Exit &77/78 = &3000 + y*640 + x*32 (screen address) \ &79/7A = &900 + y*20 + x (map address) \*** Plot Character *** \Entry &70=Colour (0-15), &71=character number, \&72=x, &72=y coordinate, &74=value to write to map. 0BF9 LDA &72 \Check x coordinate. 0BFB CMP #20 \If x<20 0BFD BCC &0C00 \continue 0BFF RTS \else return as off screen right edge. 0C00 LDA &73 \Check y coordinate 0C02 CMP #32 \If <32 0C04 BCC &0C07 \continue 0C06 RTS \else return as off screen bottom edge. 0C07 JSR &0BAE \Calculate screen and map address. 0C0A LDX &70 \Use colour 0C0C LDA &0B80,X \as index into mask table. 0C0F STA &0B91 \store result. 0C12 LDA #0 \Row count. 0C14 STA &0B90 0C17 LDA &76 \preserve high byte of pattern address. 0C19 PHA 0C1A LDA &71 \preserve character code (ASCII code-48). 0C1C PHA 0C1D LSR A 0C1E LSR A 0C1F LSR A 0C20 LSR A 0C21 LSR A \Char code DIV 32. 0C22 CLC 0C23 ADC &76 0C25 STA &76 \*&100 + base address. 0C27 LDA &71 \Char code 0C29 ASL A 0C2A ASL A 0C2B ASL A 0C2C STA &71 \*8. 0C2E LDA &74 \Put value into map 0C30 LDY #0 \By using indirect addressing 0C32 STA (&79),Y \&79/A contains map address. 0C34 LDY &71 \character byte index. 0C36 LDX #4 \Count 4 bit rotations. 0C38 LDA (&75),Y \get pattern byte. 0C3A LSR A \Rotate out pattern bit zero. 0C3B ROR &0B92 \Rotate into high bit of screen byte zero. 0C3E LSR A \Rotate out pattern bit one. 0C3F ROR &0B92 \Rotate into screen byte one. 0C42 LSR A \Pattern bit two. 0C43 ROR &0B93 \Screen byte one. 0C46 LSR A \Pattern bit three. 0C47 ROR &0B93 0C4A LSR A \Pattern bit four. 0C4B ROR &0B94 \Screen byte two. 0C4E LSR A \Pattern bit five. 0C4F ROR &0B94 0C52 LSR A \Pattern bit six. 0C53 ROR &0B95 \Screen byte three. 0C56 LSR A \Pattern bit seven. 0C57 ROR &0B95 0C5A DEX 0C5B BNE &0C38 \Until all done. 0C5D LDY &0B90 \ 0C60 LDX #3 \Count 4 columns (4 columns per char). 0C62 LDA &0B92,X \Get screen byte 0C65 AND &0B91 \AND with mask to get colour 0C68 STA (&77),Y \and put in screen. 0C6A TYA \Move to next column 0C6B CLC \by adding 0C6C ADC #8 \eight to screen 0C6E TAY \address offset. 0C6F DEX \Loop 0C70 BPL &0C62 \until done all 4 columns. 0C72 INC &71 \Increment character pattern offset. 0C74 INC &0B90 \Increment row counter 0C77 LDA #8 \and loop 0C79 CMP &0B90 \until plotted 0C7C BNE &0C34 \all eight rows of character. 0C7E PLA 0C7F STA &71 \Restore character code 0C81 PLA 0C82 STA &76 \and high byte of pattern address. 0C84 RTS \*** Read from map *** \Entry &72=x, &73=y coordinate. 0C85 JSR &0BAE \Calculate map and screen address. 0C88 LDY #0 \Get value in this cell 0C8A LDA (&79),Y \by indirect addressing 0C8C STA &74 \and store in &74. 0C8E RTS \*** Fill rectangular area of cells *** \&70=colour, &71=character with which to fill. \&B99=top left x, &B9A=top left y coordinate. \&B9B=width of rectangle, &B9C=depth of rectangle 0C8F LDA &0B99 \Copy top left x 0C92 STA &72 \to &72 0C94 LDA &0B9A \and top left y 0C97 STA &73 \to &73. 0C99 LDA #1 \ 0C9B STA &0B97 \x count=1, 0C9E STA &0B98 \y count=1. 0CA1 JSR &0BF9 \Print character. 0CA4 LDA &0B97 \If x count 0CA7 CMP &0B9B \is same as width 0CAA BEQ &0CB4 \we have done one row. 0CAC INC &72 \if not, increment x coordinate 0CAE INC &0B97 \and x count 0CB1 JMP &0CA1 \and jump back into loop. 0CB4 LDA &0B99 \Come here when we've done one row 0CB7 STA &72 \so restore top left x coordinate 0CB9 LDA #1 \ 0CBB STA &0B97 \and x count. 0CBE LDA &0B98 \If y count 0CC1 CMP &0B9C \is same as depth 0CC4 BEQ &0CCE \we have completed plotting. 0CC6 INC &73 \If not, increment y coordinate 0CC8 INC &0B98 \and y count 0CCB JMP &0CA1 \and jump back into loop. 0CCE RTS \finished plotting. \*** Choose random number *** 0CCF LDA &0B96 \Alter address from which 0CD2 SEC \random number is taken. 0CD3 ADC &7B \This is a random address from &C000-&FAFF 0CD5 STA &7B 0CD7 LDA #0 0CD9 ADC &7C 0CDB CMP #&FB \If address>&FB00 0CDD BCC &0CE1 0CDF LDA #&C0 \reset to &C000 0CE1 STA &7C 0CE3 LDA (&7B),Y \get value 0CE5 STA &0B96 0CE8 RTS \Exit A=random number \*** Set character pattern base address to &C000 *** 0CE9 LDA #&C0 \Point to &C000, 0CEB STA &7C \address of OS ROM chars. 0CED RTS \*** Increment Score *** 0CEE LDA #0 \y=0 0CF0 STA &73 0CF2 LDA #3 \digit index. 0CF4 STA &72 0CF6 JSR &0D52 \Set character pattern base address to &C080. 0CF9 LDX &72 \Retrieve digit index 0CFB INC &0B9D,X \and increment digit. 0CFE LDA &0B9D,X \Load it and 0D01 CMP #10 \reduce modulo 10, 0D03 BNE &0D13 \if digit is now 10 0D05 LDA #0 \wrap round to zero 0D07 STA &0B9D,X \and store. 0D0A STA &71 \colour=0 (white) 0D0C JSR &0BF9 \plot digit. 0D0F DEC &72 \Decrement digit index 0D11 BPL &0CF9 \until all digits plotted 0D13 STA &71 \Add zero to end of score 0D15 JSR &0BF9 \so it looks bigger! 0D18 JSR &0D5F \Reset pattern base address to &E00 0D1B RTS \and return. \*** Compare current and high score *** 0D1C LDA #0 \Digit index, start at units level. 0D1E STA &73 0D20 TAX 0D21 LDA &0B9D,X \Get digit of score and 0D24 CMP &0BA1,X \compare with high score. 0D27 BCS &0D2A \If it is bigger proceed to check next power 0D29 RTS \It must be smaller so exit. 0D2A BNE &0D32 \Score=High score. 0D2C INX \Loop till 0D2D CMP #4 \all 4 digits 0D2F BNE &0D21 \of scores compared 0D31 RTS \Score19). 12CE RTS 12CF LDA &73 12D1 CMP #32 \Y coordinate out of range (>31). 12D3 BCC &12D6 12D5 RTS 12D6 JSR &0BAE 12D9 LDX &70 12DB LDA &0B80,X 12DE STA &0B91 12E1 LDA #0 12E3 STA &0B90 12E6 LDA &76 12E8 PHA 12E9 LDA &71 12EB PHA 12EC LSR A 12ED LSR A 12EE LSR A 12EF LSR A 12F0 LSR A 12F1 CLC 12F2 ADC &76 12F4 STA &76 12F6 LDA &71 12F8 ASL A 12F9 ASL A 12FA ASL A 12FB STA &71 12FD LDA &74 12FF LDY #0 1301 STA (&79),Y 1303 LDY &71 1305 LDX #4 1307 LDA (&75),Y 1309 LSR A 130A ROR &0B92 130D LSR A 130E ROR &0B92 1311 LSR A 1312 ROR &0B93 1315 LSR A 1316 ROR &0B93 1319 LSR A 131A ROR &0B94 131D LSR A 131E ROR &0B94 1321 LSR A 1322 ROR &0B95 1325 LSR A 1326 ROR &0B95 1329 DEX 132A BNE &1307 132C LDY &0B90 132F LDX #3 1331 LDA &0B92,X 1334 AND &0B91 1337 ORA (&77),Y \OR to screen. 1339 STA (&77),Y 133B TYA 133C CLC 133D ADC #8 133F TAY 1340 DEX 1341 BPL &1331 1343 INC &71 1345 INC &0B90 1348 LDA #8 134A CMP &0B90 134D BNE &1303 134F PLA 1350 STA &71 1352 PLA 1353 STA &76 1355 RTS \*** Examine cells neighbouring climber *** \This routine examines the 3 cells underfoot. \If another climber is there its ID is put into the table at &F8E. \In the following cx=climber's x coordinate, cy=y coordinate. 1356 LDA #0 \index=0 1358 STA &0F6F 135B INC &0F6F \index=index+1 135E LDA &0F6E 1361 CMP &0F6F 1364 BCS &1367 1366 RTS 1367 LDX &0F6F \Load index, 136A LDA &0F8E,X \get climber ID 136D TAX \use it as another index 136E LDA &0F00,X \into x coordinates 1371 STA &72 1373 LDA &0F20,X \and y coordinates. 1376 STA &73 1378 LDA #0 137A STA &0F40,X \char behind =0 (bricks) 137D INC &73 137F INC &73 1381 JSR &146C \read map at (cx,cy+2) 1384 BNE &1399 \another climber there. 1386 DEC &72 1388 JSR &146C \read map at (cx-1,cy+2) 138B BNE &1399 \another climber there. 138D INC &72 138F INC &72 1391 JSR &146C \read map at (cx+1,cy+2) 1394 BNE &1399 \climber there. 1396 JMP &135B \loop until the cells below all climbers checked. 1399 TAX \if we get here there's a comrade underfoot 139A DEX 139B TXA 139C INC &0F6E \so bump index 139F LDX &0F6E 13A2 STA &0F8E,X \store climber ID in table 13A5 JMP &135B \and jump back into loop. \*** Knock the enemies off *** 13A8 JSR &14D2 \Make sound derived from climber's height. 13AB LDA &0F6E \ 13AE STA &0F6F \Make a copy of no.climbers falling. 13B1 LDX &0F6F \use it as an index 13B4 LDA &0F8E,X \into climber ID table. 13B7 TAX 13B8 LDA &0F00,X \Get climber's x coordinate 13BB STA &72 13BD LDA &0F20,X \and y coordinate 13C0 STA &73 13C2 INC &73 13C4 INC &73 \plus two. 13C6 LDA #2 13C8 STA &70 \Colour 2 (blue). 13CA LDA #0 13CC STA &74 \Char 0 (bricks). 13CE LDA &0F63 13D1 STA &71 \Plot climber lower frame 13D3 JSR &12C8 \by ORing. 13D6 DEC &73 13D8 LDA &0F62 \Plot climber upper frame 13DB STA &71 13DD JSR &12C8 \by ORing. 13E0 DEC &73 13E2 LDA #1 13E4 STA &70 \Colour 1 (red) 13E6 LDA #0 13E8 STA &71 \character 0 (bricks). 13EA JSR &0BF9 \Plot by overwriting. 13ED JSR &1482 \Wave player's arms in glee. 13F0 LDX &0F6F \Load index 13F3 LDA &0F8E,X \get climber ID 13F6 TAX \use it as an index 13F7 INC &0F20,X \to increment y coord (down screen). 13FA DEC &0F6F 13FD BNE &13B1 \Loop till all falling climbers shifted down. 13FF RTS 1400 PHA \Preserve cell value 1401 LDA #0 \Char 0 (bricks) 1403 STA &71 1405 STA &74 1407 LDA #1 \Colour 1 (red). 1409 STA &70 140B DEC &73 140D JSR &0BF9 \Plot bricks in cell above 1410 PLA \Retrieve cell value 1411 STA &74 1413 DEC &74 1415 LDA &74 1417 LDX #1 1419 STX &0F6E \Number of climbers falling=1. 141C STA &0F8E,X 141F TAX 1420 LDA #0 1422 STA &0F40,X \Char behind = bricks. 1425 JSR &1356 \Examine cells next to climber 1428 JSR &13A8 \Knock the climbers down 142B JSR &145C \Pause awhile 142E LDA &0F8F 1431 TAX 1432 LDA &0F20,X \Climber y coordinate 1435 CMP #32 \If it's <32 1437 BNE &1425 \climber is still on screen 1439 LDA #7 \else plot char 7 (man, arms up) 143B STA &71 143D JSR &0BF9 \(he's cheering). 1440 LDA #7 \Colour 7 (black) 1442 STA &70 1444 LDA #5 \Char 5 (boulder). 1446 STA &71 1448 DEC &73 \Plot boulder above player. 144A JSR &0BF9 144D LDA &0F6E \Loop until all 1450 BEQ &145B \climbers have disappeared off foot of screen. 1452 JSR &0CEE \Increment score 1455 DEC &0F6E \Decrement falling climber count 1458 JMP &144D \and loop till all climbers fallen. 145B RTS \*** Delay routine *** 145C LDX #255 145E LDA #255 1460 NOP 1461 NOP 1462 NOP 1463 NOP 1464 NOP 1465 ASL A 1466 BCS &1460 1468 DEX 1469 BNE &145E 146B RTS \*** Read map *** \This uses the routine at &C85 but if the entry conditions are out of \range (x>19 or y>31) exits with result of zero. 146C LDA #0 \Provisionally set result to 0. 146E STA &74 1470 LDA &72 1472 CMP #20 1474 BCS &147F \X coordinate off screen. 1476 LDA &73 1478 CMP #32 147A BCS &147F \Y coordinate off screen. 147C JMP &0C85 \read the map 147F LDA &74 \and return with result. 1481 RTS \*** Wave player's arms*** 1482 LDA &0F70 \Animate by switching frame 1485 EOR #1 \between chars 7,6,7,6,... 1487 STA &0F70 148A STA &71 148C LDA #4 \Colour 4 (green) 148E STA &70 1490 LDA &0F64 \Player x coordinate. 1493 STA &72 1495 LDA #2 \Player y coordinate always 2. 1497 STA &73 1499 JSR &0BF9 149C RTS \*** Reset timers for new climbers *** 149D LDA &0F73 14A0 BEQ &14A5 14A2 JMP &14A8 14A5 DEC &0F71 14A8 DEC &0F72 14AB LDA &0F72 14AE BEQ &14B4 14B0 INC &0F73 14B3 RTS 14B4 LDA &0F71 14B7 STA &0F72 14BA JSR &1158 \initiate new climber 14BD JSR &1023 \then move climbers. 14C0 RTS \*** Whooshing Sound *** \When player drops boulder. 14C1 LDA #21 14C3 LDX #4 14C5 JSR OSbyte \*FX21,4 flush sound channel 0. 14C8 LDA #7 14CA LDX #&7C 14CC LDY #&0F \Sound data at &0F7C 14CE JSR OSword \OSWORD 7 - make sound. 14D1 RTS \*** Climber falling sound *** \Make sound derived from climber's y coordinate. 14D2 LDA &73 \Y coordinate 14D4 ASL A 14D5 ASL A \times four 14D6 STA &0F80 \is the pitch. 14D9 LDA #21 14DB LDX #5 14DD JSR OSbyte \*FX21,5 flush sound channel 1 14E0 LDA #7 14E2 LDX #&7C 14E4 LDY #&0F \Sound data at &0F7C 14E6 JSR OSword \OSWORD 7 - make sound. 14E9 RTS \*** Sieged! *** 14EA LDA #21 14EC LDX #5 14EE JSR OSbyte \*FX21,5 flush sound channel 1 14F1 LDA #7 14F3 LDX #&84 14F5 LDY #&0F \Sound data at &0F84 14F7 JSR OSword 14FA RTS \*** Climber at top, castle sieged *** 14FB JSR &14EA \Make sound. 14FE LDA #4 1500 STA &73 \y=4 1502 LDA &0F8C 1505 STA &72 \x=climber x coordinate 1507 LDA #0 \Plot bricks 1509 STA &74 150B STA &71 150D LDA #1 150F STA &70 \in colour 1 (red) 1511 JSR &0BF9 \at climber's old position top. 1514 DEC &73 \y=3 1516 JSR &0BF9 \then at bottom. 1519 DEC &73 \y=2 151B JSR &145C \delay 151E JSR &145C 1521 LDA &72 \Move enemy to player position 1523 CMP &0F64 \If < player x 1526 BCC &1549 \move right 1528 BEQ &1568 \else finish. \Move enemy left to player position 152A LDA #10 \Move climber left 152C STA &71 \Char 10 (enemy left) 152E LDA #2 \Colour 2 (blue). 1530 STA &70 1532 JSR &0BF9 1535 JSR &145C 1538 JSR &145C 153B JSR &145C 153E JSR &145C \Call delay routine four times. 1541 JSR &1583 \Erase enemy. 1544 DEC &72 \x=x-1 1546 JMP &151B \Repeat until at player position. \Move enemy right to player position 1549 LDA #9 \Char 10 (enemy right) 154B STA &71 154D LDA #2 \Colour 2 (blue). 154F STA &70 1551 JSR &0BF9 1554 JSR &145C 1557 JSR &145C 155A JSR &145C 155D JSR &145C \Call delay routine four times. 1560 JSR &1583 \Erase enemy 1563 INC &72 \x=x+1 1565 JMP &151B \Repeat until at player position. \Enemy has reached player position 1568 LDA #2 156A STA &70 \Colour 2 (blue) 156C LDA #7 156E STA &71 \Char 7 (man, arms up) 1570 JSR &0BF9 1573 LDA #8 1575 STA &71 \Char 8 (blank) 1577 DEC &73 \And plot blank above him 1579 JSR &0BF9 157C JSR &145C 157F JSR &145C \Call delay routine twice 1582 RTS \and finish. \Erase enemy by printing blank space 1583 LDA #8 \Char 8 (blank) 1585 STA &71 1587 JSR &0BF9 158A RTS \*** EXECUTION POINT *** 158B JSR &1618 \Change Mode and palette. 158E JSR &0CE9 \Select address to take random number from. 1591 JSR &0D6A \Print zero score. 1594 JSR &162A \Print SIEGE 1597 JSR &1000 \Draw castle wall. 159A JSR &15BD \Wait S to be pressed. \*** Main Loop *** 159D JSR &11DE \Check keys and move player. 15A0 JSR &149D \Initiate climber according to timer. 15A3 JSR &145C 15A6 JSR &145C \Delay twice 15A9 LDA &0F8C 15AC CMP #20 \Game in progress? 15AE BCS &159D \yes - loop. 15B0 JSR &14FB \No, enemy has reached top. Call player dead routine. 15B3 JSR &0D1C \Compare score and high score. 15B6 JSR &15BD \Wait for S to be pressed 15B9 JMP &159D \Loop forever 15BC RTS \*** Wait for S press *** 15BD JSR &0DC7 \Scan keyboard 15C0 LDA &0BAC 15C3 CMP #255 \Was S pressed? 15C5 BEQ &15CA \Yes - proceed. 15C7 JMP &15BD \No - loop until it has. 15CA LDA #1 \Climber upper frame=1 15CC STA &0F61 15CF STA &0F62 \No.climbers=1. 15D2 LDA #20 15D4 STA &0F8C \Flag game in progress. 15D7 LDA #31 15D9 STA &0F8D 15DC LDA #4 15DE STA &0F63 \Climber lower frame=4. 15E1 LDA #6 \Player character 6. 15E3 STA &0F70 15E6 LDA #15 15E8 STA &0F72 15EB STA &0F71 \Zeroise table containing char behind climber \0=Bricks. 15EE LDA #0 15F0 STA &0F73 15F3 LDX &0F8D 15F6 STA &0F40,X 15F9 DEC &0F8D 15FC BPL &15EE 15FE LDA &0F64 1601 STA &72 \Player x 1603 LDA #2 1605 STA &73 \and y coordinate. 1607 LDA #8 1609 STA &71 \Char 8 (blank). 160B JSR &0BF9 160E JSR &0DA5 \Blank old scores. 1611 JSR &1000 \Draw wall. 1614 JSR &1197 \Set player coordinates. 1617 RTS \*** Change Mode *** 1618 LDA #22 161A JSR OSwrch 161D LDA #2 \MODE 2 161F JSR OSwrch 1622 LDA #5 1624 JSR OSwrch \VDU 5 1627 JMP &1663 \Define palette. \*** Print SIEGE title *** 162A JSR &0D52 \Pattern base address &C080 162D LDA #1 162F STA &70 \Colour 1 (red) 1631 LDA #0 1633 STA &73 1635 LDA #8 1637 STA &72 \Cursor at (8,0) 1639 LDA #35 163B STA &71 163D JSR &0BF9 \Print S at (8,0), 1640 INC &72 1642 LDA #25 1644 STA &71 1646 JSR &0BF9 \Print I at (9,0), 1649 LDA #21 164B STA &71 164D INC &72 164F JSR &0BF9 \Print E at (10,0) 1652 INC &72 1654 INC &72 1656 JSR &0BF9 \and at (12,0), 1659 DEC &72 165B LDA #23 165D STA &71 165F JSR &0BF9 \finally G at (11,0) 1662 RTS \Next section defines the palette \Logical: 0 1 2 3 4 5 6 7 \Actual: 7 1 4 4 2 5 6 0 \VDU 19,0,7,0,0 1663 LDA #19 1665 JSR OSwrch 1668 LDA #0 166A JSR OSwrch 166D LDA #7 166F JSR OSwrch 1672 LDA #0 1674 JSR OSwrch 1677 LDA #0 1679 JSR OSwrch 167C LDA #0 167E JSR OSwrch \VDU 19,2,4,0,0,0 1681 LDA #19 1683 JSR OSwrch 1686 LDA #2 1688 JSR OSwrch 168B LDA #4 168D JSR OSwrch 1690 LDA #0 1692 JSR OSwrch 1695 LDA #0 1697 JSR OSwrch 169A LDA #0 169C JSR OSwrch \VDU 19,3,4,0,0,0 169F LDA #19 16A1 JSR OSwrch 16A4 LDA #3 16A6 JSR OSwrch 16A9 LDA #4 16AB JSR OSwrch 16AE LDA #0 16B0 JSR OSwrch 16B3 LDA #0 16B5 JSR OSwrch 16B8 LDA #0 16BA JSR OSwrch \VDU 19,4,2,0,0,0 16BD LDA #19 16BF JSR OSwrch 16C2 LDA #4 16C4 JSR OSwrch 16C7 LDA #2 16C9 JSR OSwrch 16CC LDA #0 16CE JSR OSwrch 16D1 LDA #0 16D3 JSR OSwrch 16D6 LDA #0 16D8 JSR OSwrch \VDU 19,7,0,0,0,0 16DB LDA #19 16DD JSR OSwrch 16E0 LDA #7 16E2 JSR OSwrch 16E5 LDA #0 16E7 JSR OSwrch 16EA LDA #0 16EC JSR OSwrch 16EF LDA #0 16F1 JSR OSwrch 16F4 LDA #0 16F6 JSR OSwrch 16F9 RTS 16FA EQUB 15 16FB = 257B \*** Download Routine *** 257B EQUS "TAPE" 257F EQUB 13 2580 LDX #&7B \*command at 2582 LDY #&25 \&257B 2584 JSR OScli \*TAPE. 2587 LDA #0 \from=&1A00 2589 STA &70 258B LDA #&1A 258D STA &71 258F LDA #&80 2591 STA &72 2593 LDA #&0B \to=&0B80 2595 STA &73 2597 LDX #&B \FOR X=0 TO 11 2599 LDY #0 \FOR Y=0 TO 255 259B LDA (&70),Y 259D STA (&72),Y \Y?to=Y?from 259F DEY 25A0 BNE &259B \NEXT 25A2 INC &71 \from=from+&100 25A4 INC &73 \to=to+&100 25A6 DEX \ 25A7 BMI &25B3 25A9 BNE &259B \NEXT 25AB LDA (&70),Y 25AD STA (&72),Y 25AF LDY #&7A 25B1 BNE &171B 25B3 JMP &158B \execute.