********************************************************************************
* Stellar 7 for the Apple II, by Damon Slye *
* Copyright 1983 Dynamix *
* *
* Disassembly of "BRIEFING". *
********************************************************************************
* This drives the mission briefing. The hard work is done by the graphics *
* engine (ROCK2). This is mostly text strings and pointers to text strings. *
********************************************************************************
* Disassembly by Andy McFadden, using 6502bench SourceGen v1.6. *
* Last updated 2020/03/24 *
********************************************************************************
demo_unit_index .eq $c1 ;0-12
stop_dist .eq $c7 {addr/2}
HPAGE_EE .eq $ee ;hi-res page ($20/$40)
HIRES_ADDR_LO .eq $1500 ;hi-res row address, low byte
HIRES_ADDR_HI .eq $1600 ;hi-res row address, high byte
COPY_HIRES_2TO1 .eq $1c10 ;copies hi-res page 2 to page 1
INIT_OBJ_SLOT .eq $1dd0 ;clears various $66xx,y
INIT_GFX_ENGINE .eq $1f69 ;inits viewports, obj slots
UPDATE_DRAW_SWAP .eq $6000 ;updates objects, draws them, flips pages
RENDER_PAGE .eq $65f0 ;hi-res page to draw on (0=p1, 1=p2)
JMP_ADDR_CLEAR .eq $65f6 {addr/2} ;ClearScreen or ClearViewport
OBJ_TYPE .eq $6618 {addr/24} ;object type, 0-63
OBJ_ZC_LO .eq $6678 {addr/24} ;object Z coordinate, lo
OBJ_ZC_HI .eq $6690 {addr/24} ;object Z coordinate, hi
OBJ_FACING .eq $66d8 {addr/24} ;facing angle, 0-255
OBJ_ZC_MOVE .eq $6708 {addr/24} ;add to obj ZC each frame
OBJ_ROT_SPEED .eq $6768 {addr/24} ;rotation speed, in angle256/frame
VIEW_NEAR_VERT .eq $67d0 {addr/4} ;near clip plane, applied to vertices
VIEW_NEAR_LO .eq $67d4 {addr/4} ;near clip plane, applied to obj (low)
VIEW_NEAR_HI .eq $67d8 {addr/4} ;near clip plane, applied to obj (hi)
VIEW_X_ADJS .eq $67e4 {addr/4} ;viewport screen adjustments
VIEW_Y_ADJS .eq $67e8 {addr/4} ;viewport screen adjustments
VIEW_LEFT_VALS .eq $67ec {addr/4} ;viewport bounds, left edge
VIEW_RIGHT_VALS .eq $67f0 {addr/4} ;viewport bounds, right edge
VIEW_TOP_VALS .eq $67f4 {addr/4} ;viewport bounds, top edge
VIEW_BOTTOM_VALS .eq $67f8 {addr/4} ;viewport bounds, bottom edge
PRINT_CHAR .eq $7800 ;print a single character
PRINT_DCI_STRING .eq $78e0 ;print DCI string in $06-07
TEXT_COL .eq $78f8 ;text output column (0-39)
TEXT_ROW .eq $78f9 ;text output row (0-191, usually mult of 8)
KBD .eq $c000 ;R last key pressed + 128
KBDSTRB .eq $c010 ;RW keyboard strobe
TXTPAGE1 .eq $c054 ;RW display page 1
TXTPAGE2 .eq $c055 ;RW display page 2 (or read/write aux mem)
.org $8400
********************************************************************************
* Entry point from ROCK2. *
********************************************************************************
8400: 2c 10 c0 ENTRY bit KBDSTRB ;clear keyboard
8403: 20 1c 88 jsr Setup
8406: a2 00 ldx #$00 ;initial message
8408: a0 08 ldy #$08
840a: 20 ef 84 jsr PrintMessage
840d: d0 03 bne :Cont
840f: 4c dc 84 jmp ReturnToMenu ;return was hit, bail
8412: a9 00 :Cont lda #$00
8414: 85 c1 sta demo_unit_index ;start at the start
8416: a9 40 :ShowUnitLoop lda #$40 ;render on page 2
8418: 85 ee sta HPAGE_EE
841a: 20 b8 88 jsr EraseCapText ;erase old text
841d: 20 43 89 jsr DrawCapText ;draw new capability text
8420: a9 01 lda #$01 ;render on page 2
8422: 8d f0 65 sta RENDER_PAGE
8425: a6 c1 ldx demo_unit_index
8427: bd 28 8a lda unit_map,x ;get the unit type
842a: 8d 19 66 sta OBJ_TYPE+1 ;store in slot 1
842d: a9 0a lda #$0a
842f: 8d 69 67 sta OBJ_ROT_SPEED+1 ;spin at 10 units/frame
8432: a9 18 lda #$18
8434: 8d d9 66 sta OBJ_FACING+1 ;initial angle
8437: a5 c1 lda demo_unit_index
8439: c9 0a cmp #$0a ;hit #10 yet?
843b: a9 e8 lda #$e8 ;stop distance $00e8
843d: a2 2e ldx #$2e ;initial distance $062e
843f: a0 06 ldy #$06
8441: 90 15 bcc :First9 ;< 10
8443: a9 44 lda #$44 ;obstacle/warplink/fuelbay
8445: 8d e8 67 sta VIEW_Y_ADJS
8448: a9 37 lda #$37 ;adjust viewport to top=55
844a: 8d f4 67 sta VIEW_TOP_VALS
844d: a9 d4 lda #$d4 ;bottom=-44
844f: 8d f8 67 sta VIEW_BOTTOM_VALS
8452: a9 40 lda #$40 ;stop at distance $0140
8454: a2 86 ldx #$86 ;initial distance $0686
8456: a0 06 ldy #$06
8458: 85 c7 :First9 sta stop_dist
845a: a9 00 lda #$00
845c: 2a rol A
845d: 85 c8 sta stop_dist+1 ;0/1
845f: 8e 79 66 stx OBJ_ZC_LO+1
8462: 8c 91 66 sty OBJ_ZC_HI+1
8465: a9 d3 lda #$d3
8467: 8d 09 67 sta OBJ_ZC_MOVE+1 ;set approach velocity
846a: 20 00 60 jsr UPDATE_DRAW_SWAP
846d: 20 10 1c jsr COPY_HIRES_2TO1
8470: 20 00 60 jsr UPDATE_DRAW_SWAP
; Animate the unit in.
8473: ad 00 c0 :WaitForKey lda KBD ;wait for key
8476: 10 0b bpl L8483
8478: 2c 10 c0 bit KBDSTRB ;clear it
847b: c9 a0 cmp #“ ” ;spacebar?
847d: f0 2b beq :Next ;yes, continue to next thing
847f: c9 8d cmp #$8d ;enter?
8481: f0 5d beq ReturnToMenu1 ;yes, return to main menu
8483: 20 00 60 L8483 jsr UPDATE_DRAW_SWAP ;unknown key, keep going
8486: a5 c8 lda stop_dist+1
8488: cd 91 66 cmp OBJ_ZC_HI+1
848b: 90 e6 bcc :WaitForKey
848d: a5 c7 lda stop_dist
848f: cd 79 66 cmp OBJ_ZC_LO+1
8492: 90 df bcc :WaitForKey
8494: a9 00 lda #$00
8496: 8d 09 67 sta OBJ_ZC_MOVE+1 ;set approach vel to zero
8499: a9 02 lda #$02
849b: 8d 69 67 sta OBJ_ROT_SPEED+1 ;reduce rotation speed to 2 units/frame
849e: ad d9 66 lda OBJ_FACING+1
84a1: c9 a6 cmp #$a6
84a3: 90 ce bcc :WaitForKey
; Animation complete, wait for key or timeout.
84a5: 20 34 85 jsr WaitForKeyOrTime ;wait for key press
84a8: f0 36 beq ReturnToMenu1 ;they hit enter, bail out
; Load next thing.
84aa: a9 00 :Next lda #$00 ;they hit spacebar, move on to next
84ac: 8d 69 67 sta OBJ_ROT_SPEED+1 ;set linear and angular velocities to zero
84af: 8d 09 67 sta OBJ_ZC_MOVE+1
84b2: 20 00 60 jsr UPDATE_DRAW_SWAP ;make sure it's on both pages?
84b5: 2c 54 c0 bit TXTPAGE1 ;switch to page 1
84b8: e6 c1 inc demo_unit_index ;advance to next item
84ba: a5 c1 lda demo_unit_index
84bc: c9 0d cmp #$0d ;reached end of animated units?
84be: b0 03 bcs :ShowEndCards ;yes, show last few text frames
84c0: 4c 16 84 jmp :ShowUnitLoop
84c3: a2 08 :ShowEndCards ldx #$08 ;"...heavy armor..."
84c5: a0 0c ldy #$0c
84c7: 20 ef 84 jsr PrintMessage
84ca: f0 10 beq ReturnToMenu
84cc: a2 13 ldx #$13 ;"...intel reports..."
84ce: a0 1d ldy #$1d
84d0: 20 ef 84 jsr PrintMessage
84d3: f0 07 beq ReturnToMenu
84d5: a2 0c ldx #$0c ;"...good luck..."
84d7: a0 13 ldy #$13
84d9: 20 ef 84 jsr PrintMessage
84dc: 2c 55 c0 ReturnToMenu bit TXTPAGE2 ;switch to hi-res page 2
84df: 60 rts
84e0: a9 00 ReturnToMenu1 lda #$00
84e2: 8d 69 67 sta OBJ_ROT_SPEED+1 ;set linear and angular velocities to zero
84e5: 8d 09 67 sta OBJ_ZC_MOVE+1
84e8: 20 00 60 jsr UPDATE_DRAW_SWAP ;make sure both pages have it
84eb: 2c 55 c0 bit TXTPAGE2 ;switch to hi-res page 2
84ee: 60 rts
;
; Prints some mission briefing text. The same text will be printed to both hi-
; res pages.
;
; On entry:
; X-reg: index of first message string
; Y-reg: index of last message string + 1
;
; On exit:
; Z-flag set if Enter key was hit (return to menu)
;
• Clear variables
]string_ptr .var $06 {addr/2}
]start_index .var $c5 {addr/1}
]end_index .var $c6 {addr/1}
84ef: 86 c5 PrintMessage stx ]start_index
84f1: 84 c6 sty ]end_index
84f3: a9 01 lda #$01
84f5: 20 5b 88 jsr ClearViewport ;clear hi-res page 2
84f8: a9 40 lda #$40
84fa: 85 ee sta HPAGE_EE
84fc: 20 b8 88 jsr EraseCapText
84ff: a6 c5 :MsgLoop ldx ]start_index
8501: 20 18 85 jsr PrintString
8504: e6 c5 inc ]start_index
8506: a5 c5 lda ]start_index
8508: c5 c6 cmp ]end_index
850a: 90 f3 bcc :MsgLoop
850c: 2c 55 c0 bit TXTPAGE2 ;show page 2
850f: 20 10 1c jsr COPY_HIRES_2TO1 ;copy page 2 to page 1
8512: 2c 54 c0 bit TXTPAGE1 ;show page 1
8515: 4c 34 85 jmp WaitForKeyOrTime ;wait for a key to be pressed
8518: a9 40 PrintString lda #$40
851a: 85 ee sta HPAGE_EE
851c: a9 07 lda #$07 ;column 7
851e: 8d f8 78 sta TEXT_COL
8521: bd 59 85 lda msg_row,x ;initial row (0-191)
8524: 8d f9 78 sta TEXT_ROW
8527: bd 76 85 lda msg_addr_lo,x
852a: 85 06 sta ]string_ptr
852c: bd 93 85 lda msg_addr_hi,x
852f: 85 07 sta ]string_ptr+1
8531: 4c e0 78 jmp PRINT_DCI_STRING
;
; Waits until spacebar/enter is hit, or 27 seconds have elapsed.
;
; Returns with the Z flag set if enter was hit.
;
]timeout .var $28 {addr/1}
WaitForKeyOrTime
8534: a2 00 ldx #$00 ;configure delay
8536: a0 00 ldy #$00
8538: a9 23 lda #35
853a: 85 28 sta ]timeout
853c: ad 00 c0 L853C lda KBD ;key hit?
853f: 10 0b bpl L854C ;no, branch
8541: 2c 10 c0 bit KBDSTRB ;clear key
8544: c9 a0 cmp #“ ” ;spacebar?
8546: f0 0e beq L8556 ;yes, advance to next entry
8548: c9 8d cmp #$8d ;carriage return?
854a: f0 0a beq L8556 ;yes, quit briefing
854c: ca L854C dex ;not recognized, pause for a bit
854d: d0 ed bne L853C ;roughly ((12*256+4)*256+7)*35 ~= 27 sec
854f: 88 dey
8550: d0 ea bne L853C
8552: c6 28 dec ]timeout
8554: d0 e6 bne L853C
8556: c9 8d L8556 cmp #$8d ;set flags
8558: 60 rts
8559: 16 1f 28 3a+ msg_row .bulk $16,$1f,$28,$3a,$4c,$55,$5e,$67,$28,$31,$3a,$43,$16,$1f,$28,$31 ;hi-res row number for text strings
+ $3a,$4c,$55,$10,$19,$22,$2f,$38,$41,$4a,$53,$5f,$68
8576: b0 msg_addr_lo .dd1 <T85B0
8577: c4 .dd1 <T85C4
8578: db .dd1 <T85DB
8579: ee .dd1 <T85EE
857a: 04 .dd1 <T8604
857b: 19 .dd1 <T8619
857c: 2f .dd1 <T862F
857d: 46 .dd1 <T8646
857e: 58 .dd1 <T8658
857f: 70 .dd1 <T8670
8580: 86 .dd1 <T8686
8581: 9d .dd1 <T869D
8582: ae .dd1 <T86AE
8583: c5 .dd1 <T86C5
8584: dc .dd1 <T86DC
8585: f2 .dd1 <T86F2
8586: 07 .dd1 <T8707
8587: 1a .dd1 <T871A
8588: 2e .dd1 <T872E
8589: 43 .dd1 <T8743
858a: 5b .dd1 <T875B
858b: 73 .dd1 <T8773
858c: 8a .dd1 <T878A
858d: a2 .dd1 <T87A2
858e: b7 .dd1 <T87B7
858f: cd .dd1 <T87CD
8590: e5 .dd1 <T87E5
8591: f4 .dd1 <T87F4
8592: 0b .dd1 <T880B
8593: 85 msg_addr_hi .dd1 >T85B0
8594: 85 .dd1 >T85C4
8595: 85 .dd1 >T85DB
8596: 85 .dd1 >T85EE
8597: 86 .dd1 >T8604
8598: 86 .dd1 >T8619
8599: 86 .dd1 >T862F
859a: 86 .dd1 >T8646
859b: 86 .dd1 >T8658
859c: 86 .dd1 >T8670
859d: 86 .dd1 >T8686
859e: 86 .dd1 >T869D
859f: 86 .dd1 >T86AE
85a0: 86 .dd1 >T86C5
85a1: 86 .dd1 >T86DC
85a2: 86 .dd1 >T86F2
85a3: 87 .dd1 >T8707
85a4: 87 .dd1 >T871A
85a5: 87 .dd1 >T872E
85a6: 87 .dd1 >T8743
85a7: 87 .dd1 >T875B
85a8: 87 .dd1 >T8773
85a9: 87 .dd1 >T878A
85aa: 87 .dd1 >T87A2
85ab: 87 .dd1 >T87B7
85ac: 87 .dd1 >T87CD
85ad: 87 .dd1 >T87E5
85ae: 87 .dd1 >T87F4
85af: 88 .dd1 >T880B
85b0: 20 20 20 52+ T85B0 .dstr ‘ RAVEN COMMANDER--’
85c4: 54 68 65 20+ T85C4 .dstr ‘The information you are’
85db: 20 20 20 61+ T85DB .dstr ‘ about to view is’
85ee: 20 43 4c 41+ T85EE .dstr ‘ CLASSIFIED TOP SECRET’
8604: 20 20 53 74+ T8604 .dstr ‘ Study it carefully.’
8619: 20 57 68 65+ T8619 .dstr ‘ When you are ready to’
862f: 76 69 65 77+ T862F .dstr ‘view the enemies, press’
8646: 20 20 20 20+ T8646 .dstr ‘ the SPACE BAR.’
8658: 53 6f 6d 65+ T8658 .dstr ‘Some of the enemies have’
8670: 20 74 68 69+ T8670 .dstr ‘ thick armor, and will’
8686: 72 65 71 75+ T8686 .dstr ‘require more than 1 hit’
869d: 20 20 20 20+ T869D .dstr ‘ to destroy.’
86ae: 59 6f 75 20+ T86AE .dstr ‘You must reach Arcturus’
86c5: 61 6e 64 20+ T86C5 .dstr ‘and destroy Gir Draxon.’
86dc: 20 48 65 20+ T86DC .dstr ‘ He will be commanding’
86f2: 20 20 74 68+ T86F2 .dstr ‘ the Flagship of the’
8707: 20 20 20 41+ T8707 .dstr ‘ Arcturan Armada.’
871a: 20 20 20 47+ T871A .dstr ‘ Good luck on your’
872e: 20 20 6d 69+ T872E .dstr ‘ mission, Commander.’
8743: 49 6e 74 65+ T8743 .dstr ‘Intelligence intercepted’
875b: 74 68 69 73+ T875B .dstr ‘this transmission which’
8773: 6f 72 69 67+ T8773 .dstr ‘originated from Deneb--’
878a: 20 22 53 74+ T878A .dstr ‘ "Status Report: Guisers’
87a2: 20 20 68 61+ T87A2 .dstr ‘ have been deployed.’
87b7: 20 20 54 68+ T87B7 .dstr ‘ The Terrans will not’
87cd: 20 20 62 65+ T87CD .dstr ‘ be able to distinguish’
87e5: 20 20 74 68+ T87E5 .dstr ‘ them from..."’
87f4: 54 68 65 20+ T87F4 .dstr ‘The rest of the message’
880b: 20 20 20 20+ T880B .dstr ‘ was garbled.’
881c: 20 69 1f Setup jsr INIT_GFX_ENGINE
881f: a9 01 lda #$01
8821: 8d d0 67 sta VIEW_NEAR_VERT
8824: a9 00 lda #$00
8826: 8d d4 67 sta VIEW_NEAR_LO
8829: 8d d8 67 sta VIEW_NEAR_HI
882c: a9 5b lda #<ClearViewport
882e: 8d f6 65 sta JMP_ADDR_CLEAR
8831: a9 88 lda #>ClearViewport
8833: 8d f7 65 sta JMP_ADDR_CLEAR+1
8836: a9 84 lda #132 ;center X
8838: 8d e4 67 sta VIEW_X_ADJS
883b: a9 36 lda #54 ;center Y
883d: 8d e8 67 sta VIEW_Y_ADJS
8840: a9 a6 lda #$a6 ;-90
8842: 8d ec 67 sta VIEW_LEFT_VALS
8845: a9 5b lda #$5b ;+91
8847: 8d f0 67 sta VIEW_RIGHT_VALS
884a: a9 29 lda #$29 ;+41
884c: 8d f4 67 sta VIEW_TOP_VALS
884f: a9 c6 lda #$c6 ;-58
8851: 8d f8 67 sta VIEW_BOTTOM_VALS
8854: a0 01 ldy #$01 ;zero out slot 1
8856: a9 00 lda #$00
8858: 4c d0 1d jmp INIT_OBJ_SLOT
;
; Clears the viewport. Columns 6-31 (42-223), rows 13-112, for a 182x100
; viewport.
;
; On entry:
; A-reg: hi-res page (0=page 1, 1=page 2)
;
• Clear variables
]hires_page .var $c4 {addr/1}
]hptr0 .var $d0 {addr/2}
]hptr1 .var $d2 {addr/2}
]hptr2 .var $d4 {addr/2}
]hptr3 .var $d6 {addr/2}
885b: aa ClearViewport tax
885c: bd b6 88 lda :hires_page_hi,x ;get page hi address ($20/$40)
885f: 85 c4 sta ]hires_page
8861: a2 0d ldx #13 ;start on row 13
8863: bd 00 15 :RowLoop lda HIRES_ADDR_LO,x ;set up hi-res row ptr
8866: 85 d0 sta ]hptr0
8868: bd 00 16 lda HIRES_ADDR_HI,x
886b: 05 c4 ora ]hires_page
886d: 85 d1 sta ]hptr0+1
886f: e8 inx ;down one row
8870: bd 00 15 lda HIRES_ADDR_LO,x ;set up another
8873: 85 d2 sta ]hptr1
8875: bd 00 16 lda HIRES_ADDR_HI,x
8878: 05 c4 ora ]hires_page
887a: 85 d3 sta ]hptr1+1
887c: e8 inx
887d: bd 00 15 lda HIRES_ADDR_LO,x ;and another
8880: 85 d4 sta ]hptr2
8882: bd 00 16 lda HIRES_ADDR_HI,x
8885: 05 c4 ora ]hires_page
8887: 85 d5 sta ]hptr2+1
8889: e8 inx
888a: bd 00 15 lda HIRES_ADDR_LO,x ;and yet another
888d: 85 d6 sta ]hptr3
888f: bd 00 16 lda HIRES_ADDR_HI,x
8892: 05 c4 ora ]hires_page
8894: 85 d7 sta ]hptr3+1
8896: a9 00 lda #$00 ;clear to black
8898: a0 1f ldy #31 ;start in column 31
889a: 91 d0 :ColLoop sta (]hptr0),y ;erase 4 lines
889c: 91 d2 sta (]hptr1),y
889e: 91 d4 sta (]hptr2),y
88a0: 91 d6 sta (]hptr3),y
88a2: 88 dey
88a3: 91 d0 sta (]hptr0),y ;do another byte
88a5: 91 d2 sta (]hptr1),y ;(saves a few cycles on the loop overhead)
88a7: 91 d4 sta (]hptr2),y
88a9: 91 d6 sta (]hptr3),y
88ab: 88 dey
88ac: c0 06 cpy #6 ;end on column 6 (26 bytes == 182 pixels)
88ae: b0 ea bcs :ColLoop
88b0: e8 inx ;down one row
88b1: e0 71 cpx #113 ;stop when we reach 113 (99 rows)
88b3: 90 ae bcc :RowLoop
88b5: 60 rts
88b6: 20 40 :hires_page_hi .bulk $20,$40
;
; Erase the fill-in-the-blanks capabilities text in the bottom half of the
; screen (things like "armament", "propulsion", "speed").
;
]counter .var $c2 {addr/1}
88b8: a9 77 EraseCapText lda #119
88ba: 8d f9 78 sta TEXT_ROW
88bd: a9 0d lda #13
88bf: 8d f8 78 sta TEXT_COL
88c2: a9 0d lda #13
88c4: 20 37 89 jsr :PrintSpaces
88c7: a9 80 lda #128
88c9: 8d f9 78 sta TEXT_ROW
88cc: a9 0a lda #10
88ce: 8d f8 78 sta TEXT_COL
88d1: a9 11 lda #17
88d3: 20 37 89 jsr :PrintSpaces
88d6: a9 89 lda #137
88d8: 8d f9 78 sta TEXT_ROW
88db: a9 0c lda #12
88dd: 8d f8 78 sta TEXT_COL
88e0: a9 1c lda #28
88e2: 20 37 89 jsr :PrintSpaces
88e5: a9 92 lda #146
88e7: 8d f9 78 sta TEXT_ROW
88ea: a9 07 lda #7
88ec: 8d f8 78 sta TEXT_COL
88ef: a9 03 lda #3
88f1: 20 37 89 jsr :PrintSpaces
88f4: a9 1c lda #28
88f6: 8d f8 78 sta TEXT_COL
88f9: a9 01 lda #1
88fb: 20 37 89 jsr :PrintSpaces
88fe: a9 00 lda #0
8900: 8d f8 78 sta TEXT_COL
8903: a9 9d lda #157
8905: 8d f9 78 sta TEXT_ROW
8908: a9 28 lda #40
890a: 20 37 89 jsr :PrintSpaces
890d: a9 00 lda #0
890f: 8d f8 78 sta TEXT_COL
8912: a9 a6 lda #166
8914: 8d f9 78 sta TEXT_ROW
8917: a9 28 lda #40
8919: 20 37 89 jsr :PrintSpaces
891c: a9 00 lda #0
891e: 8d f8 78 sta TEXT_COL
8921: a9 af lda #175
8923: 8d f9 78 sta TEXT_ROW
8926: a9 28 lda #40
8928: 20 37 89 jsr :PrintSpaces
892b: a9 00 lda #$00
892d: 8d f8 78 sta TEXT_COL
8930: a9 b8 lda #184
8932: 8d f9 78 sta TEXT_ROW
8935: a9 28 lda #40
8937: 85 c2 :PrintSpaces sta ]counter
8939: a9 a0 :SpaceLoop lda #“ ”
893b: 20 00 78 jsr PRINT_CHAR
893e: c6 c2 dec ]counter
8940: d0 f7 bne :SpaceLoop
8942: 60 rts
;
; Draws the unit capability text.
;
; On entry:
; $c1: unit number (0-12)
;
• Clear variables
]string_ptr .var $06 {addr/2}
8943: a9 77 DrawCapText lda #119 ;just below viewport
8945: 8d f9 78 sta TEXT_ROW
8948: a9 0d lda #13 ;name will be centered
894a: 8d f8 78 sta TEXT_COL
894d: a6 c1 ldx demo_unit_index
894f: bd 35 8a lda name_lo,x
8952: 85 06 sta ]string_ptr
8954: bd 42 8a lda name_hi,x
8957: 85 07 sta ]string_ptr+1
8959: 20 e0 78 jsr PRINT_DCI_STRING ;print name
895c: a9 80 lda #128
895e: 8d f9 78 sta TEXT_ROW
8961: a9 0a lda #10
8963: 8d f8 78 sta TEXT_COL
8966: a6 c1 ldx demo_unit_index
8968: bd 4f 8a lda weapon_lo,x
896b: 85 06 sta ]string_ptr
896d: bd 5c 8a lda weapon_hi,x
8970: 85 07 sta ]string_ptr+1
8972: 20 e0 78 jsr PRINT_DCI_STRING ;print armament
8975: a9 19 lda #25
8977: 8d f8 78 sta TEXT_COL
897a: a6 c1 ldx demo_unit_index
897c: bd 69 8a lda shots_per_round,x
897f: 20 00 78 jsr PRINT_CHAR ;shots/round
8982: a9 89 lda #137
8984: 8d f9 78 sta TEXT_ROW
8987: a9 0c lda #12
8989: 8d f8 78 sta TEXT_COL
898c: a6 c1 ldx demo_unit_index
898e: bd 76 8a lda propulsion_lo,x
8991: 85 06 sta ]string_ptr
8993: bd 83 8a lda propulsion_hi,x
8996: 85 07 sta ]string_ptr+1
8998: 20 e0 78 jsr PRINT_DCI_STRING ;print propulsion
899b: a9 92 lda #146
899d: 8d f9 78 sta TEXT_ROW
89a0: a9 07 lda #7
89a2: 8d f8 78 sta TEXT_COL
89a5: a5 c1 lda demo_unit_index
89a7: 0a asl A ;4 bytes per entry for speed
89a8: 0a asl A
89a9: 38 sec ;+1 to skip the first char
89aa: 69 90 adc #<speed_in_kph
89ac: 85 06 sta ]string_ptr
89ae: a9 8a lda #>speed_in_kph
89b0: 69 00 adc #$00
89b2: 85 07 sta ]string_ptr+1
89b4: 20 e0 78 jsr PRINT_DCI_STRING ;print speed
89b7: a9 1c lda #28
89b9: 8d f8 78 sta TEXT_COL
89bc: a6 c1 ldx demo_unit_index
89be: bd c4 8a lda armor_thickness,x
89c1: 20 00 78 jsr PRINT_CHAR ;print armor thickness
89c4: a9 9d lda #157
89c6: 8d f9 78 sta TEXT_ROW
89c9: a9 00 lda #0
89cb: 8d f8 78 sta TEXT_COL
89ce: a6 c1 ldx demo_unit_index
89d0: bd f0 90 lda detail_line0_lo,x
89d3: 85 06 sta ]string_ptr
89d5: bd 24 91 lda detail_line0_hi,x
89d8: 85 07 sta ]string_ptr+1
89da: 20 e0 78 jsr PRINT_DCI_STRING ;print detail line 0
89dd: a9 a6 lda #$a6
89df: 8d f9 78 sta TEXT_ROW
89e2: a9 00 lda #$00
89e4: 8d f8 78 sta TEXT_COL
89e7: a6 c1 ldx demo_unit_index
89e9: bd fd 90 lda detail_line1_lo,x
89ec: 85 06 sta ]string_ptr
89ee: bd 31 91 lda detail_line1_hi,x
89f1: 85 07 sta ]string_ptr+1
89f3: 20 e0 78 jsr PRINT_DCI_STRING ;print detail line 1
89f6: a9 af lda #$af
89f8: 8d f9 78 sta TEXT_ROW
89fb: a9 00 lda #$00
89fd: 8d f8 78 sta TEXT_COL
8a00: a6 c1 ldx demo_unit_index
8a02: bd 0a 91 lda detail_line2_lo,x
8a05: 85 06 sta ]string_ptr
8a07: bd 3e 91 lda detail_line2_hi,x
8a0a: 85 07 sta ]string_ptr+1
8a0c: 20 e0 78 jsr PRINT_DCI_STRING ;print detail line 2
8a0f: a9 b8 lda #$b8
8a11: 8d f9 78 sta TEXT_ROW
8a14: a9 00 lda #$00
8a16: 8d f8 78 sta TEXT_COL
8a19: a6 c1 ldx demo_unit_index
8a1b: bd 17 91 lda detail_line3_lo,x
8a1e: 85 06 sta ]string_ptr
8a20: bd 4b 91 lda detail_line3_hi,x
8a23: 85 07 sta ]string_ptr+1
8a25: 4c e0 78 jmp PRINT_DCI_STRING ;print detail line 3
;
; Maps the sequence of units shown in the mission briefing to the unit type
; index.
;
8a28: 01 unit_map .dd1 $01 ;Sandsled
8a29: 02 .dd1 $02 ;Laser Tank
8a2a: 03 .dd1 $03 ;Hovercraft
8a2b: 04 .dd1 $04 ;Prowler
8a2c: 05 .dd1 $05 ;Heavy Tank
8a2d: 00 .dd1 $00 ;Stalker (cloaked - no model)
8a2e: 08 .dd1 $08 ;Laser Battery
8a2f: 0a .dd1 $0a ;Pulsar
8a30: 0b .dd1 $0b ;Skimmer
8a31: 0e .dd1 $0e ;Seeker
8a32: 16 .dd1 $16 ;Obstacle
8a33: 18 .dd1 $18 ;Warplink
8a34: 17 .dd1 $17 ;Fuelbay
8a35: 3f name_lo .dd1 <T8B3F
8a36: 49 .dd1 <T8B49
8a37: 54 .dd1 <T8B54
8a38: 5f .dd1 <T8B5F
8a39: 69 .dd1 <T8B69
8a3a: 74 .dd1 <T8B74
8a3b: 7e .dd1 <T8B7E
8a3c: 8b .dd1 <T8B8B
8a3d: 94 .dd1 <T8B94
8a3e: 9e .dd1 <T8B9E
8a3f: a7 .dd1 <T8BA7
8a40: b1 .dd1 <T8BB1
8a41: bb .dd1 <T8BBB
8a42: 8b name_hi .dd1 >T8B3F
8a43: 8b .dd1 >T8B49
8a44: 8b .dd1 >T8B54
8a45: 8b .dd1 >T8B5F
8a46: 8b .dd1 >T8B69
8a47: 8b .dd1 >T8B74
8a48: 8b .dd1 >T8B7E
8a49: 8b .dd1 >T8B8B
8a4a: 8b .dd1 >T8B94
8a4b: 8b .dd1 >T8B9E
8a4c: 8b .dd1 >T8BA7
8a4d: 8b .dd1 >T8BB1
8a4e: 8b .dd1 >T8BBB
8a4f: c5 weapon_lo .dd1 <T8BC5
8a50: ce .dd1 <T8BCE
8a51: e4 .dd1 <T8BE4
8a52: e4 .dd1 <T8BE4
8a53: f0 .dd1 <T8BF0
8a54: 3c .dd1 <T8B3C
8a55: da .dd1 <T8BDA
8a56: 15 .dd1 <T8C15
8a57: e4 .dd1 <T8BE4
8a58: 09 .dd1 <T8C09
8a59: 3b .dd1 <T8B3B
8a5a: 3b .dd1 <T8B3B
8a5b: 3b .dd1 <T8B3B
8a5c: 8b weapon_hi .dd1 >T8BC5
8a5d: 8b .dd1 >T8BCE
8a5e: 8b .dd1 >T8BE4
8a5f: 8b .dd1 >T8BE4
8a60: 8b .dd1 >T8BF0
8a61: 8b .dd1 >T8B3C
8a62: 8b .dd1 >T8BDA
8a63: 8c .dd1 >T8C15
8a64: 8b .dd1 >T8BE4
8a65: 8c .dd1 >T8C09
8a66: 8b .dd1 >T8B3B
8a67: 8b .dd1 >T8B3B
8a68: 8b .dd1 >T8B3B
8a69: 32 shots_per_round .dd1 ‘2’
8a6a: 31 .dd1 ‘1’
8a6b: 31 .dd1 ‘1’
8a6c: 31 .dd1 ‘1’
8a6d: 32 .dd1 ‘2’
8a6e: 3f .dd1 ‘?’
8a6f: 32 .dd1 ‘2’
8a70: 3f .dd1 ‘?’
8a71: 31 .dd1 ‘1’
8a72: 2d .dd1 ‘-’
8a73: 20 .dd1 ‘ ’
8a74: 20 .dd1 ‘ ’
8a75: 20 .dd1 ‘ ’
8a76: d1 propulsion_lo .dd1 <T8AD1
8a77: e1 .dd1 <T8AE1
8a78: f7 .dd1 <T8AF7
8a79: e1 .dd1 <T8AE1
8a7a: e1 .dd1 <T8AE1
8a7b: 0e .dd1 <T8B0E
8a7c: 1d .dd1 <T8B1D
8a7d: 1d .dd1 <T8B1D
8a7e: 21 .dd1 <T8B21
8a7f: 0e .dd1 <T8B0E
8a80: 3b .dd1 <T8B3B
8a81: 3b .dd1 <T8B3B
8a82: 3b .dd1 <T8B3B
8a83: 8a propulsion_hi .dd1 >T8AD1
8a84: 8a .dd1 >T8AE1
8a85: 8a .dd1 >T8AF7
8a86: 8a .dd1 >T8AE1
8a87: 8a .dd1 >T8AE1
8a88: 8b .dd1 >T8B0E
8a89: 8b .dd1 >T8B1D
8a8a: 8b .dd1 >T8B1D
8a8b: 8b .dd1 >T8B21
8a8c: 8b .dd1 >T8B0E
8a8d: 8b .dd1 >T8B3B
8a8e: 8b .dd1 >T8B3B
8a8f: 8b .dd1 >T8B3B
8a90: 2e 32 30 b0 speed_in_kph .dstr ‘.200’
8a94: 2e 31 32 b8 .dstr ‘.128’
8a98: 2e 31 39 b2 .dstr ‘.192’
8a9c: 2e 31 36 b0 .dstr ‘.160’
8aa0: 2e 31 32 b0 .dstr ‘.120’
8aa4: 2e 3f 3f bf .dstr ‘.???’
8aa8: 2e 20 20 b0 .dstr ‘. 0’
8aac: 2e 20 20 b0 .dstr ‘. 0’
8ab0: 2e 32 34 b0 .dstr ‘.240’
8ab4: 2e 3f 3f bf .dstr ‘.???’
8ab8: 2e 20 20 a0 .dstr ‘. ’
8abc: 2e 20 20 a0 .dstr ‘. ’
8ac0: 2e 20 20 a0 .dstr ‘. ’
8ac4: 31 armor_thickness .dd1 ‘1’
8ac5: 32 .dd1 ‘2’
8ac6: 31 .dd1 ‘1’
8ac7: 32 .dd1 ‘2’
8ac8: 33 .dd1 ‘3’
8ac9: 3f .dd1 ‘?’
8aca: 32 .dd1 ‘2’
8acb: 3f .dd1 ‘?’
8acc: 31 .dd1 ‘1’
8acd: 31 .dd1 ‘1’
8ace: 20 .dd1 ‘ ’
8acf: 20 .dd1 ‘ ’
8ad0: 20 .dd1 ‘ ’
8ad1: 52 6f 63 6b+ T8AD1 .dstr ‘Rocket Thrusters’
8ae1: 4e 75 63 6c+ T8AE1 .dstr ‘Nuclear Powered Treads’
8af7: 4a 65 74 20+ T8AF7 .dstr ‘Jet Turbine/Air Cushion’
8b0e: 41 67 72 61+ T8B0E .dstr ‘Agrav Generator’
8b1d: 4e 6f 6e e5 T8B1D .dstr ‘None’
8b21: 41 67 72 61+ T8B21 .dstr ‘Agrav and Rocket Thrusters’
8b3b: a0 T8B3B .dd1 $a0
8b3c: 3f 3f bf T8B3C .dstr ‘???’
8b3f: 20 20 53 61+ T8B3F .dstr ‘ Sandsled’
8b49: 20 4c 61 73+ T8B49 .dstr ‘ Laser Tank’
8b54: 20 48 6f 76+ T8B54 .dstr ‘ Hovercraft’
8b5f: 20 20 20 50+ T8B5F .dstr ‘ Prowler’
8b69: 20 48 65 61+ T8B69 .dstr ‘ Heavy Tank’
8b74: 20 20 20 53+ T8B74 .dstr ‘ Stalker’
8b7e: 4c 61 73 65+ T8B7E .dstr ‘Laser Battery’
8b8b: 20 20 20 50+ T8B8B .dstr ‘ Pulsar’
8b94: 20 20 20 53+ T8B94 .dstr ‘ Skimmer’
8b9e: 20 20 20 53+ T8B9E .dstr ‘ Seeker’
8ba7: 20 20 4f 62+ T8BA7 .dstr ‘ Obstacle’
8bb1: 20 20 57 61+ T8BB1 .dstr ‘ Warplink’
8bbb: 20 20 20 46+ T8BBB .dstr ‘ Fuelbay’
8bc5: 4c 6f 77 20+ T8BC5 .dstr ‘Low Laser’
8bce: 4d 65 64 69+ T8BCE .dstr ‘Medium Laser’
8bda: 48 69 67 68+ T8BDA .dstr ‘High Laser’
8be4: 4c 69 67 68+ T8BE4 .dstr ‘Light Cannon’
8bf0: 4d 65 64 69+ T8BF0 .dstr ‘Medium Cannon’
8bfd: 48 65 61 76+ .dstr ‘Heavy Cannon’
8c09: 46 69 73 73+ T8C09 .dstr ‘Fission Bomb’
8c15: 4c 61 73 65+ T8C15 .dstr ‘Laser?’
;
; Unit detail strings.
;
8c1b: a0 T8C1B .dd1 $a0
8c1c: 54 68 65 20+ T8C1C .dstr ‘The Sandsled's runners allow it to’
8c3e: 6f 70 65 72+ T8C3E .dstr ‘operate only on those planets which’
8c61: 68 61 76 65+ T8C61 .dstr ‘have a sandy or icy surface.’
8c7d: a0 T8C7D .dd1 $a0
8c7e: a0 T8C7E .dd1 $a0
8c7f: a0 T8C7F .dd1 $a0
8c80: a0 T8C80 .dd1 $a0
8c81: 54 68 65 20+ T8C81 .dstr ‘The Hovercraft is operational only on’
8ca6: 70 6c 61 6e+ T8CA6 .dstr ‘planets with an atmosphere.’
8cc1: a0 T8CC1 .dd1 $a0
8cc2: 42 45 57 41+ T8CC2 .dstr ‘BEWARE-- this little devil is tenacious.’
8cea: a0 T8CEA .dd1 $a0
8ceb: a0 T8CEB .dd1 $a0
8cec: a0 T8CEC .dd1 $a0
8ced: a0 T8CED .dd1 $a0
8cee: a0 T8CEE .dd1 $a0
8cef: 43 61 75 74+ T8CEF .dstr ‘Caution: We lost 3 scouts when they were’
8d17: 61 74 74 65+ T8D17 .dstr ‘attempting to gather information on this’
8d3f: 65 78 74 72+ T8D3F .dstr ‘extremely dangerous Arcturan unit.’
8d61: 57 65 20 68+ T8D61 .dstr ‘We have no photographs of this top’
8d83: 73 65 63 72+ T8D83 .dstr ‘secret Arcturan Agrav unit. Some’
8da4: 75 6e 73 75+ T8DA4 .dstr ‘unsubstantiated reports indicate the’
8dc8: 53 74 61 6c+ T8DC8 .dstr ‘Stalker is equipped with an Inviso Cloak’
8df0: a0 T8DF0 .dd1 $a0
8df1: 49 74 20 68+ T8DF1 .dstr ‘It has been reported that there is a’
8e15: 75 6e 69 74+ T8E15 .dstr ‘unit similar to the Laser Battery, but’
8e3b: 77 68 69 63+ T8E3B .dstr ‘which is equipped with a heavy cannon.’
8e61: a0 T8E61 .dd1 $a0
8e62: 4c 69 74 74+ T8E62 .dstr ‘Little is known about this recently’
8e85: 64 65 70 6c+ T8E85 .dstr ‘deployed Arcturan robot unit.’
8ea2: a0 T8EA2 .dd1 $a0
8ea3: 46 65 64 65+ T8EA3 .dstr ‘Federation reconnaissance informs us’
8ec7: 74 68 61 74+ T8EC7 .dstr ‘that there is at least one other type’
8eec: 6f 66 20 46+ T8EEC .dstr ‘of Flyer in the Arcturan Armada. All we’
8f13: 6b 6e 6f 77+ T8F13 .dstr ‘know is its code name: 'The Stinger'.’
8f38: a0 T8F38 .dd1 $a0
8f39: 41 72 63 74+ T8F39 .dstr ‘Arcturan Seekers will 'home in' on’
8f5b: 74 68 65 69+ T8F5B .dstr ‘their intended target and detonate.’
8f7e: a0 T8F7E .dd1 $a0
8f7f: a0 T8F7F .dd1 $a0
8f80: 54 68 65 20+ T8F80 .dstr ‘The obstacles will obstruct movement and’
8fa8: 62 6c 6f 63+ T8FA8 .dstr ‘block shells and lasers.’
8fc0: a0 T8FC0 .dd1 $a0
8fc1: 43 6f 6c 6c+ T8FC1 .dstr ‘Colliding with a Warplink will transport’
8fe9: 79 6f 75 20+ T8FE9 .dstr ‘you to the next Star System. Warplinks’
900f: 77 69 6c 6c+ T900F .dstr ‘will appear only AFTER you have’
902e: 64 65 73 74+ T902E .dstr ‘destroyed a sufficient number of enemies’
9056: 44 6f 63 6b+ T9056 .dstr ‘Docking with a Fuelbay will replenish’
907b: 79 6f 75 72+ T907B .dstr ‘your shields and energy. We are certain’
90a2: 74 68 65 72+ T90A2 .dstr ‘there is a Fuelbay in the Rigel System.’
90c9: 54 68 65 72+ T90C9 .dstr ‘There may be Fuelbays in other Systems.’
;
; Pointers to unit detail strings.
;
90f0: 1b detail_line0_lo .dd1 <T8C1B
90f1: 7d .dd1 <T8C7D
90f2: 81 .dd1 <T8C81
90f3: ea .dd1 <T8CEA
90f4: ee .dd1 <T8CEE
90f5: 61 .dd1 <T8D61
90f6: f0 .dd1 <T8DF0
90f7: 61 .dd1 <T8E61
90f8: a3 .dd1 <T8EA3
90f9: 38 .dd1 <T8F38
90fa: 7f .dd1 <T8F7F
90fb: c1 .dd1 <T8FC1
90fc: 56 .dd1 <T9056
90fd: 1c detail_line1_lo .dd1 <T8C1C
90fe: 7e .dd1 <T8C7E
90ff: a6 .dd1 <T8CA6
9100: eb .dd1 <T8CEB
9101: ef .dd1 <T8CEF
9102: 83 .dd1 <T8D83
9103: f1 .dd1 <T8DF1
9104: 62 .dd1 <T8E62
9105: c7 .dd1 <T8EC7
9106: 39 .dd1 <T8F39
9107: 80 .dd1 <T8F80
9108: e9 .dd1 <T8FE9
9109: 7b .dd1 <T907B
910a: 3e detail_line2_lo .dd1 <T8C3E
910b: 7f .dd1 <T8C7F
910c: c1 .dd1 <T8CC1
910d: ec .dd1 <T8CEC
910e: 17 .dd1 <T8D17
910f: a4 .dd1 <T8DA4
9110: 15 .dd1 <T8E15
9111: 85 .dd1 <T8E85
9112: ec .dd1 <T8EEC
9113: 5b .dd1 <T8F5B
9114: a8 .dd1 <T8FA8
9115: 0f .dd1 <T900F
9116: a2 .dd1 <T90A2
9117: 61 detail_line3_lo .dd1 <T8C61
9118: 80 .dd1 <T8C80
9119: c2 .dd1 <T8CC2
911a: ed .dd1 <T8CED
911b: 3f .dd1 <T8D3F
911c: c8 .dd1 <T8DC8
911d: 3b .dd1 <T8E3B
911e: a2 .dd1 <T8EA2
911f: 13 .dd1 <T8F13
9120: 7e .dd1 <T8F7E
9121: c0 .dd1 <T8FC0
9122: 2e .dd1 <T902E
9123: c9 .dd1 <T90C9
9124: 8c detail_line0_hi .dd1 >T8C1B
9125: 8c .dd1 >T8C7D
9126: 8c .dd1 >T8C81
9127: 8c .dd1 >T8CEA
9128: 8c .dd1 >T8CEE
9129: 8d .dd1 >T8D61
912a: 8d .dd1 >T8DF0
912b: 8e .dd1 >T8E61
912c: 8e .dd1 >T8EA3
912d: 8f .dd1 >T8F38
912e: 8f .dd1 >T8F7F
912f: 8f .dd1 >T8FC1
9130: 90 .dd1 >T9056
9131: 8c detail_line1_hi .dd1 >T8C1C
9132: 8c .dd1 >T8C7E
9133: 8c .dd1 >T8CA6
9134: 8c .dd1 >T8CEB
9135: 8c .dd1 >T8CEF
9136: 8d .dd1 >T8D83
9137: 8d .dd1 >T8DF1
9138: 8e .dd1 >T8E62
9139: 8e .dd1 >T8EC7
913a: 8f .dd1 >T8F39
913b: 8f .dd1 >T8F80
913c: 8f .dd1 >T8FE9
913d: 90 .dd1 >T907B
913e: 8c detail_line2_hi .dd1 >T8C3E
913f: 8c .dd1 >T8C7F
9140: 8c .dd1 >T8CC1
9141: 8c .dd1 >T8CEC
9142: 8d .dd1 >T8D17
9143: 8d .dd1 >T8DA4
9144: 8e .dd1 >T8E15
9145: 8e .dd1 >T8E85
9146: 8e .dd1 >T8EEC
9147: 8f .dd1 >T8F5B
9148: 8f .dd1 >T8FA8
9149: 90 .dd1 >T900F
914a: 90 .dd1 >T90A2
914b: 8c detail_line3_hi .dd1 >T8C61
914c: 8c .dd1 >T8C80
914d: 8c .dd1 >T8CC2
914e: 8c .dd1 >T8CED
914f: 8d .dd1 >T8D3F
9150: 8d .dd1 >T8DC8
9151: 8e .dd1 >T8E3B
9152: 8e .dd1 >T8EA2
9153: 8f .dd1 >T8F13
9154: 8f .dd1 >T8F7E
9155: 8f .dd1 >T8FC0
9156: 90 .dd1 >T902E
9157: 90 .dd1 >T90C9