Mercurial > hg > Members > kono > nitros9-code
view 3rdparty/packages/subsim/sub.asm @ 3226:9749d0dfc4a2
Changed a puls PC to rts to save cycles
author | David Ladd <drencor-xeen@users.sourceforge.net> |
---|---|
date | Sat, 20 Jan 2018 19:32:22 -0600 |
parents | 0de024ea86cd |
children |
line wrap: on
line source
******************************************************************** * sub - Sub Battle Simulator * * $Id$ * * Edt/Rev YYYY/MM/DD Modified by * Comment * ------------------------------------------------------------------ * 0 2003/03/28 Paul W. Zibaila * Disassembly of original distribution; as assembly continues the * various varibles will be identified (hopefully). nam sub ttl Sub Battle Simulator ifp1 use defsfile endc * I/O path definitions StdIn equ 0 StdOut equ 1 StdErr equ 2 * Enum of subroutines sub_0 equ 0 sub_1 equ 1 sub_2 equ 2 sub_3 equ 3 sub_4 equ 4 sub_5 equ 5 * defines for 5 bit zero offset instructions Zldb_u equ $E640 Zadda_u equ $AB40 Zsta_u equ $A740 Zlda_x equ $A600 Zlda_u equ $A640 Zsta_x equ $A700 Zclr_u equ $6F40 Ztst_x equ $6D00 * class X external label equates X0102 equ $0102 holds the index of the subroutine loaded X0103 equ $0103 address of subroutine module header X0105 equ $0105 address of subroutine name string X0107 equ $0107 address of subroutine module entry point X0109 equ $0109 X010B equ $010B X010C equ $010C X010E equ $010E X0110 equ $0110 X0111 equ $0111 X0112 equ $0112 X0114 equ $0114 X011A equ $011A X011B equ $011B X011E equ $011E X0120 equ $0120 X0122 equ $0122 X0124 equ $0124 X0125 equ $0125 X028F equ $028F X0290 equ $0290 X0291 equ $0291 X0292 equ $0292 X0294 equ $0294 X0295 equ $0295 X0296 equ $0296 X0297 equ $0297 X0298 equ $0298 X0299 equ $0299 X029C equ $029C X029D equ $029D X029E equ $029E X02A0 equ $02A0 X02A2 equ $02A2 X02A4 equ $02A4 X0355 equ $0355 X0356 equ $0356 X0359 equ $0359 X035F equ $035F X04F7 equ $04F7 X04F8 equ $04F8 X04F9 equ $04F9 X04FA equ $04FA X04FB equ $04FB X04FE equ $04FE X04FF equ $04FF X0500 equ $0500 X05CE equ $05CE X1D3F equ $1D3F X1D43 equ $1D43 X1D6D equ $1D6D X1D7B equ $1D7B X1D87 equ $1D87 X1D89 equ $1D89 X1D8B equ $1D8B X1D8D equ $1D8D X1DA5 equ $1DA5 X1DA7 equ $1DA7 X1DB9 equ $1DB9 X1DBF equ $1DBF X1DC9 equ $1DC9 X1DDA equ $1DDA temp store for sub index smap call and input reads X1DDB equ $1DDB temp store for jmptbl offset smap call X1DDC equ $1DDC X1DEF equ $1DEF X1DF0 equ $1DF0 X1DF2 equ $1DF2 X1DF3 equ $1DF3 X1DF5 equ $1DF5 X1DF6 equ $1DF6 X1DF7 equ $1DF7 X1DF9 equ $1DF9 X1DFA equ $1DFA X1DFC equ $1DFC X1DFD equ $1DFD X1DFF equ $1DFF X1E00 equ $1E00 X1E02 equ $1E02 X1E0D equ $1E0D X1E0E equ $1E0E X1E10 equ $1E10 X1E11 equ $1E11 X1E13 equ $1E13 X1E16 equ $1E16 year value X1E17 equ $1E17 X1E19 equ $1E19 X1E1A equ $1E1A X1E1B equ $1E1B X1E1C equ $1E1C X1E1D equ $1E1D X1E1E equ $1E1E X1E1F equ $1E1F X1E20 equ $1E20 X1E22 equ $1E22 X1E23 equ $1E23 X4265 equ $4265 X4C75 equ $4C75 side 0=German 1=US X4C76 equ $4C76 game type X4C77 equ $4C77 game level X4C80 equ $4C80 X4C81 equ $4C81 X4C82 equ $4C82 X4C84 equ $4C84 X4C85 equ $4C85 X4C87 equ $4C87 X4C88 equ $4C88 X4CA0 equ $4CA0 X4CA1 equ $4CA1 X4CA2 equ $4CA2 X4CA3 equ $4CA3 X4CB4 equ $4CB4 X4CBD equ $4CBD X4CC2 equ $4CC2 X4CCA equ $4CCA X4CCC equ $4CCC X4CCD equ $4CCD X4CD0 equ $4CD0 X4CD1 equ $4CD1 X4CD2 equ $4CD2 X4CD3 equ $4CD3 X4CD4 equ $4CD4 X4CD5 equ $4CD5 X4CD9 equ $4CD9 X4CDA equ $4CDA X4CDF equ $4CDF X4CE1 equ $4CE1 X4CE3 equ $4CE3 X4CEE equ $4CEE X4CEF equ $4CEF X4CF1 equ $4CF1 X4CF2 equ $4CF2 X4CF3 equ $4CF3 X4CF7 equ $4CF7 X4CFA equ $4CFA X4CFB equ $4CFB X4CFF equ $4CFF X4D00 equ $4D00 X4D0F equ $4D0F X4D10 equ $4D10 X4D11 equ $4D11 X4D14 equ $4D14 X4D15 equ $4D15 X4D16 equ $4D16 X4D17 equ $4D17 X4D19 equ $4D19 X4D1B equ $4D1B X4D1D equ $4D1D X4D1F equ $4D1F X4D21 equ $4D21 X4D25 equ $4D25 X4D26 equ $4D26 X4D27 equ $4D27 X4D28 equ $4D28 X4D29 equ $4D29 X4D2A equ $4D2A X4D2B equ $4D2B X4D2C equ $4D2C X4D30 equ $4D30 X4D3A equ $4D3A X71C9 equ $71C9 X71CB equ $71CB * subroutine address from code loaded out of sub6 X7228 equ $7228 X723C equ $723C X72C3 equ $72C3 X72F3 equ $72F3 X7304 equ $7304 calcs a integer based on input passed in d X735B equ $735B change palette routine X7477 equ $7477 some sort of copy routine accepts ascii between $20-$5F X74CC equ $74CC X74D9 equ $74D9 X7556 equ $7556 X7604 equ $7604 X7648 equ $7648 X765F equ $765F X7691 equ $7691 X76A4 equ $76A4 X76B9 equ $76B9 X76F7 equ $76F7 X7718 equ $7718 X7720 equ $7720 X7843 equ $7843 X7866 equ $7866 X7889 equ $7889 X7A23 equ $7A23 X7A3A equ $7A3A X7A68 equ $7A68 X7A89 equ $7A89 X7AA7 equ $7AA7 X7D56 equ $7D56 X7D75 equ $7D75 X7DB4 equ $7DB4 Sub6Load equ $7217 Sub6sz equ $0BED ( sub6 file size) STitlesz equ $3C00 ( file is larger, padded with 00) tylg set Prgrm+Objct atrv set ReEnt+rev rev set $01 edition set $10 mod eom,name,tylg,atrv,start,size * OS9 data area definitions org 0 D0000 rmb 32260 D7e04 equ . size equ . name fcs "sub" start fcb edition they put the "start" at the wrong byte :-) ldu #$0100 set u end of direct page ldx #$0102 set x to the word past it start of data area ldd #$7E04 set d to the end of the data area subd #$0102 find the difference tfr d,y move that to index reg y * make this inc by 2's next rev since * we know its an even number clr_mem L001F clr ,x+ clear x and bump one byte leay -1,y dec the counter bne clr_mem loop till we're done L001F * Intercept - Sets a signal intercept trap * * entry: * x -> address of the intercept routine * u -> starting address of the routine's memory area * exit: * Signals sent to the process cause the intercept routine * to be called instead of the process being killed. * ldu #$0000 leax intercept,pcr os9 F$Icpt * Open Path - Opens a path to the an existing file or device * as specified by the path list * entry: * a -> access mode (D S PE PW PR E W R) * x -> address of the path list * * exit: * a -> path number * x -> address of the last btye of the path list + 1 * * error: * CC -> Carry set on error * b -> error code (if any) lda #READ. leax Sub6,pcr reads this "subroutine" in as a data file os9 I$Open * Read - Reads n bytes from the specified path * entry: * a -> path number * x -> address in which to store the data * y -> is the number of bytes to read * * exit: * y -> number of bytes read * * error: * CC -> Carry set on error * b -> error code (if any) pshs a push the path num on the stack (not needed) ldx #Sub6Load base address to load file ldy #Sub6sz size of the file os9 I$Read read it in puls a pull the path num off the stack (not needed) os9 I$Close close the sub6 file * Set up screens * SetStat Function Code $8B * Allocates and maps high res screen * into application address space * entry: * a -> path number * b -> function code $8B (SS.AScrn) * x -> screen type * 0 = 640 x 192 x 2 colors (16K) * 1 = 320 x 192 x 4 colors (16K) * 2 = 160 x 192 x 16 colors (16K) * 3 = 640 x 192 x 4 colors (32K) * 4 = 320 x 192 x 16 colors (32K) * * exit: * x -> application address space of screen * y -> screen number (1-3) * * error: * CC -> Carry set on error * b -> error code (if any) * * Call use VDGINT allocates high res graphics for use with screens * updated by the process, does not clear the screens only allocates * See OS-9 Technical Reference 8-142 for more details ldx #$0001 320x192x4 colors (16K) ldd #(StdOut*$100)+SS.Ascrn path/set stat code os9 I$SetStt make the call lbcs BailOut stx X1D8B store the screen address here stx X1D8D and here and stx X1D89 here (could have at least put them in order) lda #READ. read only mode leax STitle,pcr addr of the title picture os9 I$Open open that rascal pshs a "always" push the path number ldx X1D89 addr to store it at ldy #STitlesz load 15K of screen space lda ,s get that path number for no good reason os9 I$Read read it in puls a and again get the path number in a os9 I$Close close the file STitle.pic * the following code changes the 0-3 palettes via a subroutine in sub6 ldd #$0000 PRN,CTN jsr X735B call palette change ldd #$010F PRN,CTN jsr X735B call palette change ldd #$0207 PRN,CTN jsr X735B call palette change ldd #$033F PRN,CTN jsr X735B call palette change * SS.Dscrn causes VDGINT to display a screen allocated by SS.AScrn * SetStat Function Code $8C * * entry: * a -> path number * b -> function code $8C (SS.DScrn) * y -> screen number * 0 = text screen (32 x 16) * 1-3 = high resolution screen * * error: * CC -> Carry set on error * b -> error code (if any) ldy #$01 screen number ( the screen allocated by ss.ascrn) ldd #(StdOut*$100)+SS.Dscrn $018C os9 I$SetStt call it in * F$NMLoad - Loads one or more modules from a file but does not map the module * into user's address space * entry: * a -> type/language byte * x -> address of the path list * with out path list default path is current execution dir * * exit: * a -> type/language * b -> module revision * x -> address of the last byte in the pathlist + 1 * y -> storageb requirements of the module * * error: * b -> error code if any * cc -> carry set on error leax Sub2,pcr lda #SbRtn+Objct os9 F$NMLoad lbcs BailOut * F$Link - Links to a memory module that has the specified name, language and type * entry: * a -> type/language byte * x -> address of the module name * * exit: * a -> type/language * b -> attributes/module revision * x -> address of the last byte in the modulename + 1 * y -> module entry point absolute address * u -> module header absolute address lda #SbRtn+Objct leax Sub2,pcr os9 F$Link leax Sub2,pcr stx X0105 subroutine name string address sty X0107 subroutine module entry point abs addr stu X0103 subroutine module header abs addr lda #sub_2 sta X0102 index of the subroutine currently loaded * why do we load sub2 and immediantly load and execute something in sub1? * prior to smap call load acca with index of subroutine * and load accb with and index into the jump tables at entry of each subroutine ldd #(sub_1*$100)+$00 turns echo and pause off lbsr SMap lda #$33 lbsr L0598 L00D1 lda X0500 ora X4C82 bne L011F ldx X0292 bne L0114 ldx #$0005 stx X0292 lbsr L1C34 lbsr L0A2A lbsr L1EA2 lbsr L12F1 lbsr L16D0 lbsr L188E lbsr L18FD lbsr L19AB lbsr L1A9E lbsr L1B26 lbsr L1BBF lbsr L11FC lbsr L112B lbsr L10A0 lbsr L0BAF lbsr L17CE L0114 ldx X0292 leax -1,x stx X0292 lbsr L0E76 L011F lbsr L06A7 jsr X7D56 lbsr InpReady tsta beq L00D1 lbsr L084A clr X0110 lbsr L013B lda X0110 beq L00D1 bra L011F L013B cmpa #$38 bhi L0145 cmpa #$31 lbhs L0598 L0145 cmpa #$62 lbeq L0290 cmpa #$64 lbeq L0356 cmpa #$65 lbeq L0296 cmpa #$66 lbeq L03BD cmpa #$67 lbeq L029C cmpa #$68 lbeq L033E cmpa #$69 lbeq L02A2 cmpa #$6A lbeq L02A8 cmpa #$4A lbeq L02AE cmpa #$6B lbeq L0344 cmpa #$6D lbeq L02B4 cmpa #$6F lbeq L02BA cmpa #$70 lbeq L02C0 cmpa #$71 lbeq L02D8 cmpa #$72 lbeq L02C6 cmpa #$73 lbeq L02CC cmpa #$74 lbeq L02D2 cmpa #$75 lbeq L02DE cmpa #$76 lbeq L02E4 cmpa #$77 lbeq L040F cmpa #$78 lbeq L02EA cmpa #$79 lbeq L02F0 cmpa #$7A lbeq L02F6 cmpa #$2C lbeq L034A cmpa #$2E lbeq L0350 cmpa #8 lbeq L033E cmpa #$09 lbeq L0344 cmpa #$0C lbeq L0326 cmpa #$0A lbeq L0320 cmpa #$B1 lbeq L032C cmpa #$B2 lbeq L0376 cmpa #$30 lbeq L03B7 cmpa #$39 lbeq L03AB cmpa #$2F lbeq L028A cmpa #$2A lbeq L032C cmpa #$3A lbeq L032C cmpa #$3D lbeq L0376 cmpa #$2D lbeq L0376 cmpa #1 lbeq L0308 cmpa #2 lbeq L03A2 cmpa #4 lbeq L0332 cmpa #6 lbeq L0338 cmpa #7 lbeq L06CD cmpa #$0B lbeq L0314 cmpa #$0D lbeq L0368 cmpa #$12 lbeq L0302 cmpa #$13 lbeq L02FC cmpa #$0E lbeq L0399 cmpa #$0F lbeq L030E cmpa #$10 lbeq L0362 cmpa #$11 lbeq L0435 cmpa #$14 lbeq L0384 cmpa #$16 lbeq L035C cmpa #$17 lbeq L031A rts L028A ldd #(sub_2*$100)+$4A lbra SMap L0290 ldd #(sub_2*$100)+$0E lbra SMap L0296 ldd #(sub_2*$100)+$0C lbra SMap L029C ldd #(sub_2*$100)+$0A lbra SMap L02A2 ldd #(sub_2*$100)+$42 lbra SMap L02A8 ldd #(sub_2*$100)+$3C lbra SMap L02AE ldd #(sub_2*$100)+$3A lbra SMap L02B4 ldd #(sub_2*$100)+$16 lbra SMap L02BA ldd #(sub_2*$100)+$26 lbra SMap L02C0 ldd #(sub_2*$100)+$28 lbra SMap L02C6 ldd #(sub_2*$100)+$12 lbra SMap L02CC ldd #(sub_2*$100)+$10 lbra SMap L02D2 ldd #(sub_2*$100)+$06 lbra SMap L02D8 ldd #(sub_2*$100)+$1A lbra SMap L02DE ldd #(sub_2*$100)+$40 lbra SMap L02E4 ldd #(sub_2*$100)+$48 lbra SMap L02EA ldd #(sub_2*$100)+$46 lbra SMap L02F0 ldd #(sub_2*$100)+$08 lbra SMap L02F6 ldd #(sub_2*$100)+$44 lbra SMap L02FC ldd #(sub_1*$100)+$06 MakeFile lbra SMap L0302 ldd #(sub_1*$100)+$08 ReadFile lbra SMap L0308 ldd #(sub_5*$100)+$0C lbra SMap L030E ldd #(sub_1*$100)+$04 Read_mission lbra SMap L0314 ldd #(sub_1*$100)+$10 XmtSOS lbra SMap L031A ldd #(sub_2*$100)+$2A lbra SMap L0320 ldd #(sub_2*$100)+$20 lbra SMap L0326 ldd #(sub_2*$100)+$1E lbra SMap L032C ldd #(sub_2*$100)+$24 lbra SMap L0332 ldd #(sub_5*$100)+$06 lbra SMap L0338 ldd #(sub_5*$100)+$08 lbra SMap L033E ldd #(sub_2*$100)+$32 lbra SMap L0344 ldd #(sub_2*$100)+$34 lbra SMap L034A ldd #(sub_2*$100)+$36 lbra SMap L0350 ldd #(sub_2*$100)+$38 lbra SMap L0356 ldd #(sub_2*$100)+$3E lbra SMap L035C ldd #(sub_1*$100)+$16 XmtPOS lbra SMap L0362 ldd #(sub_2*$100)+$4C lbra SMap L0368 ldd #(sub_2*$100)+$1C lbsr SMap lda X0294 lbne L0582 rts L0376 ldd #(sub_2*$100)+$22 lbsr SMap lda X0294 lbne L0582 rts L0384 ldd #(sub_1*$100)+$14 TransferTorp lbsr SMap ldb X0291 bmi L0395 ldd #(sub_2*$100)+$14 lbsr SMap L0395 clr X0291 rts L0399 inc X0297 ldd #(sub_1*$100)+$02 GameSetup lbra SMap L03A2 inc X0297 ldd #(sub_5*$100)+$00 lbra SMap L03AB ldb X4CD4 subb #$0A clra std X4CF7 lbra L0376 L03B7 ldd X4CEF jmp X7AA7 L03BD ldd #(sub_2*$100)+$30 lbsr SMap tstb bmi L040E pshs b ldx X1DC9 beq L03D3 ldd #(sub_4*$100)+$02 lbsr SMap L03D3 tst ,s+ beq WeMissed lda #$14 suba X4C77 adda X1E16 suba #$27 ldu X1DBF bne L03E9 ldu X1DB9 L03E9 lbsr L0E26 jsr X72C3 fcc "We hit, Sir" fcb C$NULL rts WeMissed L03FC jsr X72C3 fcc "We missed, Sir" fcb C$NULL L040E rts L040F ldd #(sub_2*$100)+$18 lbsr SMap lda X1E1D cmpa #4 bne L0434 lda X1D43 cmpa #7 beq L0434 lda X05CE cmpa #1 ble L042C lda #1 L042C sta X05CE lda #$36 lbra L0598 L0434 rts L0435 ldd #(sub_5*$100)+$0A lbsr SMap tst X0299 bne L0441 rts L0441 ldu X0103 Expects sub2 loaded module header abs addr os9 F$UnLink lbsr UnLoadtheRest call to unload clra clrb BailOut L044C pshs cc,b save condition code and b (error code) lda #SbRtn+Objct module type leax Sub2,pcr sub2 subroutine os9 F$UnLoad unload it lda #SbRtn+Objct try one more time leax Sub2,pcr os9 F$UnLoad puls cc,b pull that condition code and os9 error code ldd #((Prgrm+Objct)*$100)+00 lang/type =a opt data size =b 1100 leax Shell,pcr points to name string ldy #0 parameter size ldu #0 beginning addr of parameter area os9 F$Chain chain to it os9 F$Exit kill ourself UnLoadtheRest L0476 pshs a,b,x,y,u lda #SbRtn+Objct leax Sub1,pcr os9 F$UnLoad lda #SbRtn+Objct leax Sub3,pcr os9 F$UnLoad lda #SbRtn+Objct leax Sub4,pcr os9 F$UnLoad lda #SbRtn+Objct leax Sub5,pcr os9 F$UnLoad puls a,b,x,y,u,pc * acca = index of suroutine to call; accb = offset into jumptable of routine to execute SMap cmpa X0102 compare acca to the index of the currently "loaded" subroutine bne SMap2 not the same? map in a new one jsr [X0107] otherwise calling the one currently mapped so have at it rts * as with many other places this logic can be streamlined SMap2 L04A8 std X1DDA save the callers arguments leax Sub1,pcr get the address of "sub1C$null" deca make us zero based ldb #Subsz size of the text string "sub?0" mul multipy them now we have an offset to the name string to use from sub1 leax d,x index to that rascal stx X1DDC store the address of the new name string lda X0102 get subroutine index beq NoneMapped if its zero nothing loaded (not sure if this will ever be true) ldu X0103 otherwise get loaded subroutine module header abs addr os9 F$UnLink and unlink it NoneMapped L04C3 ldx X1DDC (not needed) unlink doen't fiddle with x lda #SbRtn+Objct type language os9 F$Link link to it bcc GoodLink all went well save pointers and call it lda X1DDA load the new sub index cmpa #sub_2 is it looking for sub2 ? beq LinkMe Link to me then I've been loaded once BadLink L04D4 lda X0102 get the currently loaded sub index cmpa #sub_2 is it sub2? bne LoadMe if it's not sub2 then NMload it ldu X0103 load pointer to currently loaded sub2 module header os9 F$UnLink unlink that one and go load and link new one bra LoadMe BadLoad L04E3 ldx X0105 pointer to current sub name string beq LoadMe I'm zero? then go load module to be mapped lda #SbRtn+Objct otherwise attempt to unload 1,3,4,5 subs lbsr UnLoadtheRest LoadMe L04ED lda #SbRtn+Objct type/language ldx X1DDC name string of new module to load os9 F$NMLoad load it bcs BadLoad bad load? LinkMe L04F7 lda #SbRtn+Objct type/language ldx X1DDC address of the name string os9 F$Link link to it bcs BadLink GoodLink L0501 ldx X1DDC pointer to module name string stx X0105 stow that sty X0107 pointer to module entry point stu X0103 pointer to module header addr ldd X1DDA fetch back the arguments passed sta X0102 stow the acca value in subroutine index jsr ,y make the call rts return to the one that called us * The following few not labeled by disasm * hope they really don't call a sub to clear a mem location N0517 clr X1D87 rts N051B pshs a lda #$FF sta X1D87 puls a,pc N0524 pshs a,b,x,y,u lda #READ. open read only leax Radar,pcr the radar.dat file os9 I$Open open it pshs a push the stupid path number ldb #$74 load the loop counter $74 x $3D = $1BA4 * file is only 1BA1 long ldx #$1E25 base address to accept the data RadLp lda ,s pull the path num pshs b,x push the loop counter and base address ldy #$003D read 61 bytes at a time os9 I$Read read them puls b,x pull our counter and addr leax $50,x bump the address by 80 decb dec the loop counter bne Radlp puls a pull that path that's still the same os9 I$Close close the file puls a,b,x,y,u,pc * they snuck a jump in here instead of a jsr N0550 ldd #$0212 PRN,CTN jmp X735B call Change Pallete N0556 pshs a,b,x,y,u THERE IS NO STATUS.DAT file lda #READ. open read only leax Status,pcr status.dat os9 I$Open open it pshs a push that path num ldb #$74 load the loop counter ldx #$1E25 base address to store status StaLp lda ,s get the path number pshs b,x save loop counter and destination ldy #$003D read 61 bytes at a time os9 I$Read make the call puls b,x leax $50,x Move 80 bytes ahead decb dec the loopcounter bne StaLp not zero go again puls a pull that path num os9 I$Close puls a,b,x,y,u,pc L0582 clr X0294 lda X1D43 beq L0597 cmpa #3 beq L0597 cmpa #5 bcc L0597 lda #$31 lbra L0598 L0597 rts L0598 suba #$30 lbeq L0685 cmpa #8 lbhi L0685 ldb X1E1D cmpb #4 bne L05B7 cmpa #4 lblo L0685 cmpa #7 lbeq L0685 L05B7 cmpa #5 bne L0605 ldb X4CDA bne L05E3 jsr X72C3 fcc "Our sub does not have radar!" fcb C$NULL fcb C$CLSALL fcb C$NULL fcb $A2 L05E3 tst X4D2B bne L0605 jsr X72C3 fcc "Radar turned off, Sir!" fcb C$NULL fcb C$CLSALL fcb C$NULL fcb $80 L0605 ldx X4CEF beq L0648 cmpa #2 bne L0629 L060E jsr X72C3 fcc "You would drown, Sir" fcb C$NULL fcb C$CLSALL fcb C$NULL fcb $5C L0629 cmpa #3 beq L060E cmpa #5 bne L0648 jsr X72C3 fcc "Underwater, Sir!" fcb C$NULL fcb C$CLSALL fcb C$NULL fcb $3D L0648 deca cmpa X1D43 lbeq L0685 sta X1D43 ldu #$0000 stu X1DB9 leax >WordTbl1,pcr asla ldd a,x std X010C leax >WordTbl2,pcr lda X1D43 asla ldd a,x leax D0000,pcr leax d,x stx X010E ldd #$0236 PRN,CTN jsr X735B call Change Palette ldd #$0109 PRN,CTN jsr X735B call Change Palette inc X0297 L0685 rts WordTbl1 L0686 fdb $0400 fdb $0400 fdb $0400 fdb $0202 fdb $0200 fdb $0300 fdb $0502 fdb $0204 WordTbl2 L0696 fdb $06A6 fdb $051B fdb $0517 fdb $0524 fdb $0524 fdb $0550 fdb $06A6 fdb $0556 fcb $39 L06A7 lda X0297 beq L06BB clr X0297 leax >L06BB,pcr pshs x ldx X010E pshs x rts L06BB ldd X010C lbra SMap intercept L06C1 sta X010B lda #C$EOF sta X029C lda X010B rti L06CD ldd #(sub_3*$100)+$02 lbsr SMap lda X035F beq L06D9 rts L06D9 tst X4D28 bne L06E4 ldd #(sub_2*$100)+$0C lbsr SMap L06E4 lda #5 sta X1E1D ldd #(sub_2*$100)+$1A lbsr SMap ldd #$0015 jsr X7A68 lda #$38 lbsr L0598 lbsr L188E lbsr L18FD lbsr L19AB lbsr L1A9E lbsr L1B26 lbsr L1BBF ldb #$FF stb X0290 L0711 ldy #$0356 ldu #$4C84 jsr X74D9 cmpa #2 bls L0755 jsr X7556 std X4CF3 std X4CFB lbsr L1C34 lbsr L1C34 lbsr L1C34 lbsr L1EA2 lbsr L12F1 lbsr L16D0 lbsr L112B lbsr L0BAF lbsr L0E76 lbsr L06A7 tst X4CF2 beq L0755 tst X0500 bne L0755 tst X4D25 beq L0711 L0755 ldb X0356 stb X4C84 ldd #$4000 std X4C85 ldb X0359 stb X4C87 ldd #$4000 std X4C88 ldu #$4C84 jsr X7D75 pshs a,b jsr X7DB4 tstb beq L07AA ldd ,s inca jsr X7DB4 tstb bne L078C ldd #$BF68 std X4C88 bra L07AA L078C ldd ,s incb inca jsr X7DB4 tstb bne L07A1 ldd #$BF68 std X4C88 std X4C85 bra L07AA L07A1 ldd #$BF68 std X4C85 std X4C88 L07AA puls a,b clr X4D2C clr X0125 jsr X72C3 fcc "Navigator disengaging, Sir!" fcb C$NULL lda #1 sta X1E1D ldd #(sub_2*$100)+$1A lbsr SMap ldd X4CF3 jsr X7A23 ldd X4CF3 load d with some value std X4CFB store it a this mem location lbsr L1F5A call a subroutine that stores it there again ldd #$0000 sta X0290 jsr X7A68 rts ReadKey N07F5 pshs b,x,y clra set path to stdin ldx #$4265 base address to store data ldy #$01 read one byte os9 I$Read read it lda X4265 get the byte just read cmpa #C$INTR is it a key board interrupt (ctrl-C) beq Ex1rk cmpa #C$QUIT is it a keyboard abort (ctrl-E) bne Ex_rk Ex1rk lda #C$EOF Ex_rk puls b,x,y,pc InpReady L0811 pshs b,x,y inc X1D3F bump some mem location clra set path to stdin ldb #SS.Ready test if data available os9 I$GetStt make the call bcc ReadKey2 data ready go read it clra not ready clear a that is still 0 puls b,x,y,pc pull b back over any error code and return ReadKey2 L0821 clra data ready to read set path to stdin still ldx #$1DDA set address to hold data ldy #$01 read one byte os9 I$Read make the call lda X1DDA load the byte just read adda X1D3F add it to some mem location sta X1D3F stow the result back lda X1DDA get the byte read again cmpa #C$INTR is it a key board interrupt (ctrl-C) beq EndKey tst X029C bne EndKey puls b,x,y,pc EndKey L0843 clr X029C lda #C$EOF puls b,x,y,pc L084A pshs a,b,x,y,u ChkInp lbsr InpReady tsta bne ChkInp puls a,b,x,y,u,pc * acca = index to ship type from caller * this routine is actually pretty slick TypeShip L0854 pshs a,b,x,y,u save'm all leax >ShipType,pcr point x at shiptype array TSLopI tsta test index passed in beq Ex_TS When 0 call screen write and leave TSLopN ldb ,x+ accb is a throw away moved x to one past null bne TSLopN deca decrement the index loop bra TSLopI test that value Ex_TS jsr X74CC puts one char at a time to screen puls a,b,x,y,u,pc we're done return * acca = index to type of plane from caller * assume input is 0 or 1 TypePlane L0869 pshs a,b,x,y,u save'm all ldb X4C75 side 0=German 1=US bne L0872 not German adda #$02 Is German L0872 leax >WhatPlane,pcr load base of offset table lda a,x based on index load the offset value leax >PlaneType,pcr load base of plane name strings leax a,x based on offset index to chosen one jsr X74CC puts one char at a time to screen puls a,b,x,y,u,pc were done return ShipType L0883 fcc "P.T. Boat" name strings fcb C$NULL fcc "Troop Ship" fcb C$NULL fcc "Tanker" fcb C$NULL fcc "Cargoship" fcb C$NULL fcc "Carrier" fcb C$NULL fcc "Battleship" fcb C$NULL fcc "Destroyer" fcb C$NULL fcc "Escort" fcb C$NULL WhatPlane L08CD fcb Zerox-PlaneType $00 name string offsets fcb Aichi-PlaneType $0D fcb AVngr-PlaneType $15 fcb Ctlna-PlaneType $1D PlaneType Zerox L08D1 fcc "Zero, Sir" name strings fcb C$NULL Aichi fcc "Aichi, Sir" fcb C$NULL AVngr fcc "Avenger" fcb C$NULL Ctlna fcc "Catalina" fcb C$NULL L08F7 pshs a,b,x,y,u leax >L090C,pcr L08FD tstb beq L0907 L0900 lda ,x+ bne L0900 decb bra L08FD L0907 jsr X74CC puls a,b,x,y,u,pc L090C fcc "sonar" fcb C$NULL fcc "radio" fcb C$NULL fcc "engines" fcb C$NULL fcc "rudder" fcb C$NULL fcc "ballast" fcb C$NULL fcc "hull" fcb C$NULL fcc "fwd tubes" fcb C$NULL fcc "aft tubes" fcb C$NULL fcc "planes" fcb C$NULL fcc "aa gun" fcb C$NULL fcc "periscope" fcb C$NULL fcc "batteries" fcb C$NULL fcc "deck gun" fcb C$NULL fcc "radar" fcb C$NULL L0979 pshs a,b,x,y,u leax >L098E,pcr L097F tstb beq L0989 L0982 lda ,x+ bne L0982 decb bra L097F L0989 jsr X74CC puls a,b,x,y,u,pc L098E fcc "sonar is" fcb C$NULL fcc "radio is" fcb C$NULL fcc "engines are" fcb C$NULL fcc "rudder is" fcb C$NULL fcc "ballast is" fcb C$NULL fcc "hull is" fcb C$NULL fcc "fwd tubes are" fcb C$NULL fcc "aft tubes are" fcb C$NULL fcc "planes are" fcb C$NULL fcc "aa gun is" fcb C$NULL fcc "periscope is" fcb C$NULL fcc "batteries are" fcb C$NULL fcc "deck gun is" fcb C$NULL fcc "radar is" fcb C$NULL L0A2A pshs a,b,x,y,u ldd X4CEF lslb rola cmpd #$000A bcs L0A3A subd #$000A L0A3A std X011E ldd X0120 std X0122 clr X0125 ldu #$4C84 jsr X7D75 pshs a,b,x,y cmpa #5 lbls L0B69 cmpa #$D8 lbhs L0B69 cmpb #5 lbls L0B69 tst X4C75 side 0=German 1=US bne L0A6D Not German (US) cmpb #$9A lbhs L0B69 bra L0A73 L0A6D cmpb #$C2 lbhs L0B69 L0A73 ldd ,s jsr X7DB4 tstb beq L0A8D puls a,b,x,y tst X0500 bne L0A8B ldd #$0518 lbsr SMap inc X0500 L0A8B puls a,b,x,y,u,pc L0A8D ldd ,s cmpx #$4E20 bcs L0AB1 inca jsr X7DB4 tstb beq L0AB1 ldd #$4E20 pshs a,b tfr x,d subd ,s++ std X0120 inc X0125 cmpx #$5550 lbhi L0B69 L0AB1 cmpx #$2E40 bhi L0AD5 ldd ,s deca jsr X7DB4 tstb beq L0AD5 stx X0120 ldd #$2E40 subd X0120 std X0120 inc X0125 cmpx #$2710 lblo L0B69 L0AD5 cmpy #$2E40 bhi L0AFC ldd ,s decb jsr X7DB4 tstb beq L0AFC sty X0120 ldd #$2E40 subd X0120 std X0120 inc X0125 cmpy #$2710 lblo L0B69 L0AFC cmpy #$4E20 bcs L0B22 ldd ,s incb jsr X7DB4 tstb beq L0B22 ldd #$4E20 pshs a,b tfr y,d subd ,s++ std X0120 inc X0125 cmpy #$5550 lbhi L0B69 L0B22 lda X0125 beq L0B33 ldd #$0730 subd X0120 cmpd X011E ble L0B69 L0B33 clr X4D2C tst X0125 beq L0B65 ldb #$19 jsr X7691 cmpb #5 bne L0B65 jsr X72C3 fcc "We are in shallow water, Sir." fcb C$NULL L0B65 puls a,b,x,y puls a,b,x,y,u,pc L0B69 clr X0125 tst X4D2C bne L0BA6 jsr X72C3 fcc "We have run aground, Sir" fcb C$NULL ldb #$0C jsr X7691 lda X4C77 inca mul lbsr L0D3A ldd #0 jsr X7A3A ldd #0 jsr X7A68 L0BA6 lda #$FF sta X4D2C puls a,b,x,y puls a,b,x,y,u,pc L0BAF pshs a,b,x,y,u tst X4C82 lbne L0D38 tst X4C76 lbeq L0CCF tst X0295 lbeq L0CCF clr X0295 tst X4C80 lbmi L0C71 ldx #$4C98 lda X4C80 leax a,x ldb ,x stb X1E10 ldb 4,x stb X1E0D ldd #$7FFF std X1E0E std X1E11 ldu #$4C84 ldy #$1E0D jsr X74D9 ldb X4C77 cmpb #2 blt L0C02 cmpa #1 bcc L0C71 bra L0C06 L0C02 cmpa #2 bcc L0C71 L0C06 clr X4C81 lda X4C80 ldx #$4CA4 ldy #$4C78 inc a,y ldb a,y jsr X723C jsr X723C pshs a,b clra jsr X7304 calcs a integer based on input passed in d jsr X72F3 fcc " day" fcb C$NULL cmpb #1 beq L0C34 jsr X72F3 fcc "s" fcb $73 fcb $00 L0C34 jsr X72F3 fcc " on station, Sir!" fcb C$NULL jsr X7228 puls a,b cmpb a,x bne L0C71 jsr X72C3 fcc "We can leave now, Sir" fcb C$NULL ldd #$010E lbsr SMap L0C71 tst X4C81 beq L0C79 dec X4C81 L0C79 ldx #$4C8A clrb L0C7D tst ,x bmi L0C8B tst 3,x bmi L0C8B dec 3,x bne L0C8B beq L0C94 L0C8B leax 1,x incb cmpb #3 bne L0C7D bra L0C9D L0C94 inc X0298 ldd #$010C lbsr SMap L0C9D ldx #$4C90 clrb L0CA1 tst ,x bmi L0CAF tst 4,x bmi L0CAF dec 4,x bne L0CAF bra L0CB8 L0CAF leax 1,x incb cmpb #4 blt L0CA1 bra L0CCF L0CB8 stb X0296 lda #$16 mul addd #$0579 tfr d,x lbsr L11C8 std X1D6D ldd #$010A lbsr SMap L0CCF ldb X4CA0 bmi L0CE7 ldb X4CA2 bmi L0CE7 dec X4CA2 bne L0CE7 clr X028F ldd #(sub_2*$100)+$4E lbsr SMap L0CE7 ldb X4CA1 bmi L0D01 ldb X4CA3 bmi L0D01 dec X4CA3 bne L0D01 ldb #1 stb X028F ldd #(sub_2*$100)+$4E lbsr SMap L0D01 ldx #$4A80 ldb X4CB4 lda #$15 mul leax d,x ldb 13,x bne L0D38 ldd 14,x cmpd #$1388 bhi L0D38 tst X4C81 bne L0D38 ldd #$050E lbsr SMap inc X4C82 lda X4C76 cmpa #2 bne L0D38 lda X0500 bne L0D38 ldd #$0112 lbsr SMap L0D38 puls a,b,x,y,u,pc L0D3A pshs a,b,x,y,u incb pshs b lbsr L0DEC lbsr L0DEC puls a tsta bne L0D4C lda #2 L0D4C ldb #$0D tst X4CDA beq L0D54 incb L0D54 jsr X7691 ldu #$4D2D tst b,u bpl L0D60 bra L0D8A L0D60 adda b,u cmpa #$30 bcs L0D68 lda #$FF L0D68 sta b,u jsr X723C jsr X72F3 fcc "The " fcb C$NULL lbsr L0979 cmpa #0 bge L0D9E jsr X72F3 fcc " destroyed" fcb C$NULL L0D8A ldb #5 jsr X7691 addb #8 lda X4C77 inca mul addb X4CEE stb X4CEE bra L0DD9 L0D9E jsr X72F3 fcc " damaged" fcb C$NULL jsr X7228 jsr X723C jsr X72F3 fcc "Repairs estimated at " fcb C$NULL tfr a,b clra jsr X7304 calcs a integer based on input passed in d jsr X72F3 fcc " hours" fcb C$NULL L0DD9 jsr X7228 lda X4CEE bpl L0DEA clr X0355 ldd #$0504 lbsr SMap L0DEA puls a,b,x,y,u,pc L0DEC pshs a,b,x,y,u ldy #$07D0 L0DF2 mul leay -1,y bne L0DF2 ldd #$0027 PRN,CTN jsr X735B call Change Palette ldd #$0300 PRN,CTN jsr X735B call Change Palette ldd #$0F26 PRN,CTN jsr X735B call Change Palette ldy #$0FA0 L0E0D mul leay -1,y bne L0E0D ldd #$033F PRN,CTN jsr X735B call Change Palette ldd #$0000 PRN,CTN jsr X735B call Change Palette ldd #$0F00 PRN,CTN jsr X735B call Change Palette puls a,b,x,y,u,pc L0E26 pshs a,b,x,y,u fdb Zldb_u ldb 0,u cmpb #$64 bcc L0E51 leax ByteTbl1,pcr ldb $12,u ldb b,x jsr X76F7 inca fdb Zadda_u adda 0,u cmpa #$64 bcs L0E43 lda #$64 L0E43 fdb $A740 sta 0,u lda $10,u cmpa #1 bcc L0E51 lda #1 sta $10,u L0E51 lda X1D43 cmpa #2 bhi L0E74 stu X71C9 clr X71CB L0E5E ldd #(sub_4*$100)+$00 lbsr SMap inc X71CB lda X71CB cmpa #8 bcs L0E5E ldd #0 std X71C9 L0E74 puls a,b,x,y,u,pc L0E76 ldx #$0115 os9 F$Time ldb X011A tst X0290 bne L0E8B cmpb X011B lbeq L0F2D L0E8B stb X011B ldd X1E20 cmpd #$003C bcs L0EAD ldu #$0E10 jsr X76B9 lbsr L0ECF tfr u,d ldu #$003C jsr X76B9 lbsr L0EBE tfr u,d L0EAD addb X1E1B stb X1E1B cmpb #$3C bcs L0F2D subb #$3C stb X1E1B ldb #1 L0EBE addb X1E1A stb X1E1A cmpb #$3C bcs L0F2D subb #$3C stb X1E1A ldb #1 L0ECF lbsr L0F45 lbsr L0F97 addb X1E19 stb X1E19 cmpb #$18 bcs L0F2E subb #$18 stb X1E19 lbsr L0F2E lda #$FF sta X0295 ldd X1E17 addd #1 cmpd #$016D bcs L0EFE ldd #0 inc X1E16 L0EFE std X1E17 lda X4D21 cmpa #2 bgt L0F1D jsr X72C3 fcc "Supplies low, Sir" fcb C$NULL L0F1D lda X4D21 cmpa #254 bne L0F2A ldd #$0510 lbra SMap L0F2A dec X4D21 L0F2D rts L0F2E clra cmpb #5 bcs L0F41 cmpb #5 beq L0F40 cmpb #$12 beq L0F40 cmpb #$12 bhi L0F41 inca L0F40 inca L0F41 sta X1E1C rts L0F45 pshs a,b,x,y,u stb X0114 ldx #$4D2D clrb L0F4E lda b,x lbeq L0F90 lbmi L0F90 suba X0114 sta b,x lbpl L0F90 clr b,x jsr X723C jsr X72F3 fcc "Repair of the " fcb C$NULL lbsr L08F7 jsr X7228 jsr X72C3 fcc "completed, Sir" fcb C$NULL L0F90 incb cmpb #$0E bcs L0F4E puls a,b,x,y,u,pc L0F97 pshs a,b,x,y,u pshs b lda X4D28 lbeq L0FF4 ldd X4CEF lbne L0FF4 ldb X4CF2 bpl L0FAF negb L0FAF lda ,s mul lda X4CDF mul lsra rorb lsra rorb cmpd #0 bne L0FC1 incb L0FC1 coma comb addd #1 addd X4D1B cmpd #0 bge L0FD2 ldd #0 L0FD2 std X4D1B lda X4D29 beq L0FF4 ldd X4D1B beq L0FF4 lda ,s clrb addd X4D1D cmpd #$6300 bcs L0FEE ldd #$6300 L0FEE std X4D1D lbra L1060 L0FF4 lda X4D28 lbne L1060 ldd X4D1D lbeq L1060 ldb X4CF2 bpl L1008 negb L1008 pshs a,b clra ldb X4CD5 cmpd X4CEF bhi L101A puls a,b addb #3 pshs a,b L101A puls a,b lslb lslb lda ,s mul incb lda X4CE3 asla mul coma comb addd #1 addd X4D1D cmpd #0 bge L105D ldd X4D1D beq L105A jsr X72C3 fcc "The batteries are dead, Sir!" fcb C$NULL L105A ldd #0 L105D std X4D1D L1060 ldb X4CD5 clra cmpd X4CEF bls L1072 ldd #$6300 std X4D1F bra L109C L1072 lda ,s ldb X4CE1 lslb lslb addb X4C77 incb lslb lslb mul lslb rola coma comb addd #1 addd X4D1F cmpd #0 bge L1099 ldd #$0512 lbsr SMap ldd #0 L1099 std X4D1F L109C puls b puls a,b,x,y,u,pc L10A0 lda X4D25 sta X1DDA clr X4D25 clr X1DDB lda #$45 sta X1E13 ldx #$42B5 L10B4 fdb Zlda_x lda 0,x lbmi L1109 lda 13,x lbne L1109 ldd X4CEF beq L10CF ldd 14,x cmpd #$1770 bhi L10FC bra L10EE L10CF ldd 14,x tst X4CDA beq L10E8 tst X4D2B beq L10E8 tst X4D3A bne L10E8 cmpd #$6000 bhi L10FC bra L10EE L10E8 cmpd #$2000 bhi L10FC L10EE inc X4D25 lda X1DDA bne L112A ldd #(sub_2*$100)+$2C lbra SMap L10FC cmpx #$480A bcc L1109 inc X1DDB ldd 11,x std X1D6D L1109 leax 21,x dec X1E13 bne L10B4 ldd X4CEF bne L112A lda X1DDB beq L112A lda X4D26 beq L1124 dec X4D26 rts L1124 ldd #(sub_2*$100)+$2E lbra SMap L112A rts L112B lda #4 sta X1E13 ldx #$4A02 ldy #$0579 L1137 fdb Zlda_x lda 0,x lbmi L1196 lda 20,x bne L1148 lda #$FF fdb Zsta_x sta 0,x bra L1196 L1148 clr 20,x lda 16,x beq L1163 lda 13,x cmpa #3 bcs L115B clr 16,x bra L1163 L115B ldb #8 stb 2,x clr 1,x bra L1169 L1163 ldb 1,y stb 2,x clr 1,x L1169 lbsr L11A4 tsta bne L1191 lda 8,y inca cmpa #3 bne L118C pshs a,b lda 2,y ldb 4,y sta 4,y stb 2,y lda 5,y ldb 7,y sta 7,y stb 5,y puls a,b lda #1 L118C sta 8,y lbsr L11A4 L1191 jsr X7556 std 9,x L1196 leax 21,x leay 22,y dec X1E13 lbne L1137 rts L11A4 pshs y lda 8,y leay a,y ldd #0 std X1DF7 std X1DFA ldb 2,y stb X1DF6 ldb 5,y stb X1DF9 ldy #$1DF6 leau 3,x jsr X74D9 puls y,pc L11C8 pshs x,y,u ldd #0 std X1DF7 std X1DFA std X1DFD std X1E00 ldb 2,x stb X1DF6 ldb 5,x stb X1DF9 ldb 3,x stb X1DFC ldb 6,x stb X1DFF ldy #$1DFC ldu #$1DF6 jsr X74D9 jsr X7556 puls x,y,u,pc L11FC lda #$02 loop counter sta X1E13 store in scratch ldx #$4A56 base address L1204 fdb Zlda_x lda 0,x lbmi L12E6 on minus skip loop ldu $13,x lda $07,u beq L1282 ldd X4CEF bne L1276 lda $0D,x bne L1276 ldd $0E,x lsra right shift d (/2) rorb lsra right shift d (/2) rorb lsra right shift d (/2) (effectively /8) rorb cmpd X1E1E bhi L1276 fdb Zlda_u lda 0,u bne L124D jsr X72C3 fcc "We picked up the flier, Sir" fcb C$NULL bra L1270 L124D jsr X72C3 fcc "We picked up the shore party" fcb C$NULL clr X4D27 L1270 lda #$FF fdb Zsta_x sta 0,x bra L12E6 L1276 ldd $0B,x load a value indexed from x addd #$02D0 add 720 to it jsr X7648 call a sub that forces value to be 0-1440 std $09,x save the result and go to bump counter bra L12E6 L1282 leay $01,u leau $03,x jsr X74D9 pshs a,u jsr X7556 std $09,x puls a,u tsta bne L12E6 tfr u,d lsra left shift d (/2) rorb lsra left shift d (/2) rorb lsra left shift d (/2) (effectively /8) rorb cmpd X1E1E bhi L12E6 jsr X72C3 fcc "Shore party has reached land" fcb C$NULL jsr X72C3 fcc "Shore party returning, Sir" fcb C$NULL ldu $13,x inc $07,u L12E6 leax $15,x dec X1E13 lbne L1204 rts L12F1 lda #$41 sta X1E13 ldx #$42B5 L12F9 fdb Zlda_x lda 0,x lbmi L1394 cmpa #$64 lbhs L1394 pshs a,b,x,y,u lda 13,x bne L1362 ldd 14,x cmpd #$0064 bhi L1362 ldd X4CEF tsta bne L1362 lda X4CD5 adda X4D11 adda #$14 pshs a cmpb ,s+ bcc L1362 ldb #4 jsr X7691 cmpb #2 bne L1362 ldb #$14 jsr X7691 lda X4C77 inca mul incb lbsr L0D3A andb #7 addb X4CEE stb X4CEE jsr X72C3 fcc "We have been rammed, Sir" fcb C$NULL L1362 puls a,b,x,y,u lda 18,x ldb #$0C mul addd #$0501 tfr d,y std X0109 lda 16,x cmpa #2 bcc L137E lbsr L145B bra L138E L137E ldy X0109 lda 7,y beq L138B lbsr L14EC bra L138E L138B lbsr L15F9 L138E clr X1D7B lbsr L139F L1394 leax 21,x dec X1E13 lbne L12F9 rts L139F ldu 19,x beq L13DC cmpx #$480A bcc L13AC inc $14,u L13AC lda $10,u cmpa 16,x bcs L13BC sta 16,x clr 17,x bra L13DC L13BC ldb 17,x beq L13DC tst X1E1E bne L13D1 subb X1E1F cmpb #1 blt L13D1 stb 17,x rts L13D1 clr 17,x sta $10,u lda #5 sta $11,u L13DC lda 13,x bne L1454 tst X1D7B beq L13F4 ldd 1,x cmpd #$0032 bhi L13F4 ldd #$0035 std 1,x bra L13F9 L13F4 lda X4D2C bne L1444 L13F9 ldb X4CD5 clra cmpd X4CEF bls L1444 lda 16,x cmpa #2 lbeq L1443 ldu #$0064 cmpa #1 bcs L1416 ldu #$01F4 L1416 ldd #$2000 tst X1D7B beq L1421 ldd #$6000 L1421 pshs d ldd 14,x cmpd ,s++ bhi L1444 tst X1D7B bne L1439 jsr X76B9 incb jsr X7691 tstb bne L1443 L1439 lda #2 sta 16,x lda #5 sta 17,x L1443 rts L1444 lda 16,x cmpa #2 bne L1453 lda #1 sta 16,x clr 17,x L1453 rts L1454 clr 16,x clr 17,x rts L145B ldu 19,x lbeq L14E1 pshs y leay $03,u leau 3,x jsr X74D9 puls y tsta bne L1476 cmpu #$1F40 bcs L1485 L1476 ldu 19,x ldd $01,u addd #4 pshs d jsr X7556 bra L1497 L1485 ldu 19,x ldd $01,u cmpd #$000C bls L1493 ldd #$000C L1493 pshs a,b ldd $09,u L1497 subd 9,x lbeq L14B0 jsr X765F ldy X0109 ldu 1,y lbsr L1DD0 addd 9,x jsr X7648 std 9,x L14B0 lda 16,x beq L14C0 ldy X0109 ldb 1,y clra leas 2,s bra L14C2 L14C0 puls a,b L14C2 subd 1,x lbeq L14E0 ldy X0109 ldu 4,y lbsr L1DD0 addd 1,x ldy X0109 cmpb 1,y bls L14DE ldb 1,y clra L14DE std 1,x L14E0 rts L14E1 lda 13,x cmpa #3 bcs L14E0 lda #$FF fdb Zsta_x sta 0,x rts L14EC lda 13,x lbne L154E ldd X4CEF tsta bne L1539 cmpb X4CD5 bhi L1539 ldb #$14 subb X4C77 jsr X7691 tstb bne L1539 ldd 14,x cmpd #$3A98 bhi L1539 ldu #$03E8 jsr X76B9 incb jsr X7691 tstb beq L1522 lbsr L15B8 bra L1539 L1522 lda X4C77 inca ldy X0109 ldb 8,y lsrb incb addb X1E1D mul jsr X7691 incb lbsr L0D3A L1539 ldd 14,x cmpd #$07D0 bhi L154E ldd #$0168 jsr X76A4 addd 11,x addd #$02D0 bra L1553 L154E ldd 11,x addd #$02D0 L1553 subd 9,x lbeq L156C jsr X765F ldy X0109 ldu 1,y lbsr L1DD0 addd 9,x jsr X7648 std 9,x L156C ldy X0109 ldb 1,y fdb $A600 beq L159A cmpa #$64 bcs L157D clrb bra L159A L157D cmpa #$0A bhi L1584 decb bra L159A L1584 cmpa #$50 bhi L1594 cmpa #$3C bhi L1595 cmpa #$28 bhi L1596 decb decb bra L159A L1594 lsrb L1595 lsrb L1596 lsrb bne L159A incb L159A ldy X0109 clra subd 1,x beq L15B7 ldu 4,y lbsr L1DD0 ldy X0109 addd 1,x cmpb 1,y bls L15B5 ldb 1,y clra L15B5 std 1,x L15B7 rts L15B8 pshs a,b,x,y,u lda X1D43 cmpa #2 bhi L15F4 lda #$FF sta X02A2 ldb #$64 jsr X7691 clra addd #$0032 std X029E ldb #$1E jsr X7691 pshs b ldb #$73 subb ,s+ clra std X02A0 clr X029D L15E4 ldd #(sub_4*$100)+$00 lbsr SMap inc X029D lda X029D cmpa #8 bcs L15E4 L15F4 clr X02A2 puls a,b,x,y,u,pc L15F9 ldd 11,x subd 9,x lbeq L1614 jsr X765F ldy X0109 ldu 1,y lbsr L1DD0 addd 9,x jsr X7648 std 9,x L1614 ldy X0109 ldb 1,y fdb Zlda_x $A600 beq L1642 cmpa #$64 bcs L1625 clrb bra L1642 L1625 cmpa #$0A bhi L162C decb bra L1642 L162C cmpa #$50 bhi L163C cmpa #$3C bhi L163D cmpa #$28 bhi L163E decb decb bra L1642 L163C lsrb L163D lsrb L163E lsrb bne L1642 incb L1642 clra ldy X0109 subd 1,x beq L165F ldu 4,y lbsr L1DD0 ldy X0109 addd 1,x cmpb 1,y bls L165D ldb 1,y clra L165D std 1,x L165F lda 18,x cmpa #4 lbeq L1669 rts L1669 ldb #$0A lda #4 suba X4C77 mul jsr X7691 tstb beq L1678 rts L1678 pshs a,b,x,y,u lda #4 sta X0111 ldu #$480A L1682 fdb Zlda_u lda 0,u lbpl L16C4 fdb Zclr_u clr 0,u ldd 3,x std $03,u ldd 5,x std $05,u ldd 7,x std $07,u ldd 9,x std $09,u stx $13,u lda 16,x sta $10,u clr $11,u ldb #2 jsr X7691 stb $12,u pshs a,b,y addb #7 lda #$0C mul addd #$0502 tfr d,y ldb ,y clra std $01,u puls a,b,y inc X04FB L16C4 leau $15,u dec X0111 lbne L1682 puls a,b,x,y,u,pc L16D0 lda #4 sta X1E13 ldx #$480A L16D8 fdb Zlda_x lda 0,x bmi L16F1 lda 16,x cmpa #2 bcc L16E8 lbsr L16FC bra L16EB L16E8 lbsr L1758 L16EB inc X1D7B lbsr L139F L16F1 leax 21,x dec X1E13 lbne L16D8 rts L16FC lda 13,x cmpa #3 bcs L1707 lda #$FF fdb Zsta_x sta 0,x rts L1707 ldu 19,x lbeq L1757 fdb Zlda_u lda 0,u lbmi L1757 ldu $13,u fdb Zlda_u lda 0,u lbmi L1757 leay $03,u leau 3,x jsr X74D9 pshs a jsr X7556 tst ,s+ bne L1742 cmpu #$1000 bhi L1742 pshs a,b ldd #$003C jsr X76A4 addd ,s++ addd #$0410 bra L1745 L1742 addd #$02D0 L1745 subd 9,x jsr X765F ldu #$0020 lbsr L1DD0 addd 9,x jsr X7648 std 9,x L1757 rts L1758 lda 13,x lbne L17B2 ldd X4CEF tsta bne L179D cmpb X4CD5 bhi L179D ldb #$0A jsr X7691 tstb bne L179D ldd 14,x cmpd #$0FA0 bhi L179D ldu #$03E8 jsr X76B9 incb jsr X7691 tstb beq L178B lbsr L15B8 bra L179D L178B lda X4C77 adda #2 ldb X1E1D addb #2 mul jsr X7691 incb lbsr L0D3A L179D ldd 14,x cmpd #$07D0 bhi L17B2 ldd #$0168 jsr X76A4 addd 11,x addd #$02D0 bra L17B7 L17B2 ldd 11,x addd #$02D0 L17B7 subd 9,x lbeq L17CD jsr X765F ldu #$0010 lbsr L1DD0 addd 9,x jsr X7648 std 9,x L17CD rts L17CE lda X1E1D cmpa #4 beq L17D6 rts L17D6 ldb #6 lda X4C77 adda #4 mul jsr X7691 tstb beq L17E5 rts L17E5 ldb #3 jsr X7691 tstb beq L1827 lda #4 sta X0111 ldu #$480A L17F5 fdb Zlda_u lda 0,u lbpl L181C inc X04FB ldb #2 jsr X7691 stb $12,u pshs a,b,y addb #7 lda #$0C mul addd #$0502 tfr d,y ldb ,y clra std $01,u puls a,b,y lbra L1855 L181C leau $15,u dec X0111 lbne L17F5 rts L1827 lda #$41 sta X0111 ldu #$42B5 L182F fdb Zlda_u lda 0,u lbpl L184A inc X04FA ldb #4 jsr X7691 addb #4 stb $12,u ldd #8 std $01,u lbra L1855 L184A leau $15,u dec X0111 lbne L182F rts L1855 fdb Zclr_u clr 0,u ldd #$8000 jsr X76A4 addd #$8000 addd X4C85 std $04,u ldd #$8000 jsr X76A4 addd #$8000 addd X4C88 std $07,u lda X4C84 sta $03,u lda X4C87 sta $06,u ldd #0 std $09,u std $13,u lda #2 sta $10,u clr $11,u rts L188E lda X4D16 beq L18A6 ldu X1E1E cmpu #$001E bcc L18A7 suba X1E1F cmpa #1 blt L18A7 sta X4D16 L18A6 rts L18A7 clr X4D16 lda X4D15 beq L18CE jsr X72C3 fcc "Deck gun missed, Sir" fcb C$NULL ldd #0 std X4D17 rts L18CE ldu X4D17 lda #$17 ldb X1E16 subb #$26 pshs b adda ,s+ lbsr L0E26 jsr X72C3 fcc "A shell hit, Sir" fcb C$NULL ldd #0 std X4D17 inc X04FF rts L18FD lda #$14 sta X1E13 ldx #$485E L1905 fdb Ztst_x tst 0,x lbmi L19A0 lbsr L1A63 tsta beq L1953 inc X04FE lda #$FF fdb Zsta_x sta 0.x lda X4CC2 lbsr L0E26 jsr X723C ldd #$0048 std X1DA5 ldd #$0082 std X1DA7 jsr X72F3 fcc "Torpedo " fcb C$NULL ldb 16,x clra jsr X7304 calcs a integer based on input passed in d jsr X72F3 fcc " hit, Sir" fcb C$NULL jsr X7228 lbra L19A0 L1953 ldd 17,x addd X1E1E std 17,x cmpd X4CBD bcs L19A0 lda #$FF fdb Zsta_x sta 0,x jsr X723C ldd #$0048 std X1DA5 ldd #$0082 std X1DA7 jsr X72F3 fcc "Torpedo " fcb C$NULL ldb 16,x clra jsr X7304 calcs a integer based on input passed in d jsr X72F3 fcc " has stopped, Sir" fcb C$NULL jsr X7228 L19A0 leax 21,x dec X1E13 lbne L1905 rts L19AB lda #$10 sta X1E13 ldx #$4AFE L19B3 tst 16,x beq L19D2 tst X1E1E bne L19CC ldb 16,x subb X1E1F bpl L19C6 clrb L19C6 stb 16,x lbra L1A53 L19CC clr 16,x lbra L1A53 L19D2 fdb Ztst_x tst 0,x lbmi L1A53 ldd #5 std 1,x lda 13,x bne L1A1D ldd 14,x cmpd #$000A bhi L1A1D ldb #$32 jsr X7691 lda X4C77 inca mul lbsr L0D3A andb #$1F addb X4CEE stb X4CEE jsr X72C3 fcc "A mine hit the sub, Sir" fcb C$NULL lda #$FF fdb Zsta_x sta 0,x L1A1D lbsr L1A63 tsta beq L1A53 lda #$FF fdb Zsta_x sta 0,x lda #$28 lbsr L0E26 jsr X72C3 fcc "I think a mine exploded, " fcc "Sir!" fcb C$NULL jsr X7228 lbra L1A53 L1A53 ldd #$0000 std 1,x leax 21,x dec X1E13 lbne L19B3 rts L1A63 pshs b,x,y leay 3,x ldb 2,x incb lda X1E1F adda #5 mul std X0112 lda #$41 sta X0111 ldx #$42B5 L1A7B fdb Ztst_x tst 0,x bmi L1A93 leau 3,x jsr X74D9 tsta bne L1A93 cmpu X0112 bhi L1A93 tfr x,u lda #1 puls b,x,y,pc L1A93 leax 21,x dec X0111 bne L1A7B clra puls b,x,y,pc L1A9E lda X4D14 beq L1AFF ldu X1E1E cmpu #$001E bcc L1AB7 suba X1E1F cmpa #1 blt L1AB7 sta X4D14 rts L1AB7 clr X4D14 ldu X4D19 beq L1AFF stu X4D17 lbsr L1B0C stb X4D16 sta X4D15 lda X1E23 sta X4D14 ldd #$0000 std X4D19 jsr X72C3 fcc "Firing deck gun, Sir" fcb C$NULL ldd #$3C02 duration and amplitude of tone ldy #$0E10 relative freq counter L1AF6 lbsr ToneOut leay -2,y suba #$0A bne L1AF6 L1AFF rts ToneOut L1B00 pshs a,b,x,y,u tfr d,x ldd #(StdOut*$100)+SS.Tone os9 I$SetStt puls a,b,x,y,u,pc L1B0C lda $0D,u bne SetD not zero ldd $0E,u otherwise load the next two bytes cmpd #$3A98 compare bhi SetD ldu #$03E8 jsr X76B9 incb clra rts SetD L1B21 lda #$01 ldb #$10 rts L1B26 ldy #$0000 clrb L1B2B lbsr L1B47 incb cmpb X4CCC bcs L1B2B ldy #1 L1B38 lbsr L1B47 incb tfr b,a suba X4CCC cmpa X4CCD bcs L1B38 rts L1B47 pshs a,b,x,y,u clra tfr d,x lda $4D05,x lble L1BBD ldu X1E1E cmpu #$001E bcc L1B6B suba X1E1F cmpa #1 blt L1B6B sta $4D05,x lbra L1BBD L1B6B lda $4D01,y cmpa $4CFF,y blt L1B7D lda #$FF sta $4D05,x bra L1BBD L1B7D clr $4D05,x jsr X723C jsr X72F3 fcc "Tube " fcb C$NULL tfr x,d addd #1 jsr X7304 calcs a integer based on input passed in d jsr X72F3 fcc " has been reloaded, Sir" fcb C$NULL jsr X7228 inc $4D01,y jsr X7843 jsr X7866 L1BBD puls a,b,x,y,u,pc L1BBF lda X4D0F lbeq L1C33 ldu X1E1E cmpu #$0258 bcc L1BDA suba X1E1F cmpa #$01 blt L1BDA sta X4D14 rts L1BDA clr X4D0F jsr X72C3 fcc "Torpedo transfered, Sir" fcb C$NULL lda X4D10 bne L1C12 inc X4CFF jsr X7843 ldx #$4D05 clra L1C07 ldb a,x ble L1C2E inca cmpa X4CCC bcs L1C07 rts L1C12 inc X4D00 jsr X7866 ldx #$4D05 lda X4CCC L1C1E ldb a,x ble L1C2E inca tfr a,b subb X4CCC cmpb X4CCD bcs L1C1E rts L1C2E ldb X1E23 stb a,x L1C33 rts L1C34 pshs a,b,x,y,u lda X0125 load byte from $0125 beq L1C4C if zero branch to next block ldd #$0730 load d with 1840 subd X0120 subtract value held at $0120 lsra divide d /2 rorb lsra and again divide by /2 rorb lsra and again divide by /2 rorb lsra and again divide by /2 (effective /16) rorb stb X0124 store LSB at $0124 L1C4C lda X4D2C beq Notaground ldd X0120 cmpd X0122 bls Notaground jsr X72C3 fcc "We are still aground, Sir!" fcb C$NULL ldd #$0000 jsr X7A3A ldd #$0000 jsr X7A68 Notaground L1C84 ldu X4CF3 ldd X4CF1 ldy #$4C84 lbsr L1E1D ldd X4CF1 beq L1CBB ldd X4CFB subd X4CF3 beq L1CBB jsr X765F ldu #$0002 tst X4D30 beq L1CAC ldu #$0001 L1CAC lbsr L1DD0 cmpd #$0000 beq L1CBB addd X4CF3 jsr X7A23 L1CBB lda X4D28 bne L1CD5 lda X4CD2 tst X4D2A beq L1CC9 lsra divide by 2 L1CC9 ldb X4CD3 ldy #$4D38 load a base address tst X4D1D bra L1CE2 L1CD5 lda X4CD0 ldb X4CD1 ldy #$4D2F load a base address tst X4D1B L1CE2 bne L1CE6 clra clrb L1CE6 tst ,y beq L1CFE tst X4C77 beq L1CF3 clra clrb bra L1CFE L1CF3 tst ,y bmi L1CFA lsra bra L1CFE L1CFA lda #$01 ldb #$01 L1CFE sta X1DDA negb stb X1DDB ldb X4CFA cmpb X1DDA ble L1D10 ldb X1DDA L1D10 cmpb X1DDB bge L1D18 ldb X1DDB L1D18 sex subd X4CF1 lbeq L1D2C ldu #$0002 lbsr L1DD0 addd X4CF1 jsr X7A3A L1D2C lda X4CCA beq L1D55 ldu X1E1E cmpu #$001E bcc L1D47 suba X1E1F cmpa #$01 blt L1D47 sta X4CCA lbra L1DCE L1D47 clr X4CCA lda X4D28 beq L1D55 ldd #(sub_2*$100)+$0C lbsr SMap L1D55 ldd X4CF7 subd X4CEF lbeq L1DCE ldu #$0002 lbsr L1DD0 addd X4CEF pshs d save this value on the stack jsr X7A89 ldd ,s copy it back off the stack cmpd #$001E compare it to 30 blt L1D8C less than that branch over smap calls lda X1D43 otherwise load a from this mem location cmpa #$01 compare that to 1 bne L1D82 not equal 1 skip one smap call ldd #(sub_5*$100)+$16 lbsr SMap L1D82 cmpa #$02 compare value from x1d43 to 2 bne L1D8C not equal 2 skip next smap call ldd #(sub_5*$100)+$16 lbsr SMap L1D8C ldb X4CD9 lda #$06 mul cmpd ,s bcs L1DA1 subd #$0064 cmpd ,s bls L1DAB bra L1DCC L1DA1 puls d clean up stack ldd #(sub_5*$100)+$14 lbsr SMap puls a,b,x,y,u,pc L1DAB ldb #$0F jsr X7691 tstb bne L1DCC jsr X72C3 fcc "We are too deep, Sir!" fcb C$NULL L1DCC puls a,b L1DCE puls a,b,x,y,u,pc * caller passes arguments in d and u * subroutine passes back a value in d and restores u L1DD0 pshs u save the u value on the stack clr X1DF5 clear this flag cmpd #$0000 bpl L1DE3 branch on plus inc X1DF5 otherwise increment our flag coma complement a comb complement b addd #$01 and add one to d L1DE3 std X1DDA stow that tfr u,d transfer the value in u to d stb X1DDC stow the LSB lda X1E1F load value into a mul multiply them std X1DF0 stow that off clr X1DEF clear here ldb X1DDC get the LSB passed in u that was saved lda X1E1E load a value in a mul multiply them addd X1DEF add in the 0 from the byte we just cleared std X1DEF and save it back there tsta test MSB of calcualted value bne L1E0E not zero branch and load first computed value ldd X1DF0 load the second computed value cmpd X1DDA compare that to the first computed value blo L1E11 less than branch L1E0E ldd X1DDA otherwise load the first computed value L1E11 tst X1DF5 test the flag beq L1E1B if zero branch to exit coma otherwise compliment a comb and compliment b addd #1 then add 1 L1E1B puls u,pc * d,u,y set by calling routine L1E1D pshs a,b,x,y,u cmpd #$0000 ble L1E2A less or equal move on lsra divide d/2 rorb lsra divide d/2 again for a total of /4 rorb incb bump b by one L1E2A stu X1E02 save the u clr X1DF5 clear some mem location cmpd #$0000 check d again bpl L1E3E positive move on inc X1DF5 otherwise bump that mem location coma compliment both a and b comb addd #1 bump by one L1E3E std X1DDA save that value lda X1E1F mul std X1DF0 clr X1DEF so this is zero lda X1DDA ldb X1E1F mul addd X1DEF and we add a zero here ? std X1DEF now stow it here lda X1DDB ldb X1E1E mul addd X1DEF std X1DEF lda X1DDA ldb X1E1E mul addb X1DEF stb X1DEF ldd X1E02 jsr X7718 jsr X7604 ldd 1,y addd X1DF3 std 1,y lda ,y adca X1DF2 sta ,y ldd X1E02 jsr X7720 jsr X7604 ldd 4,y addd X1DF3 std 4,y lda 3,y adca X1DF2 sta 3,y puls a,b,x,y,u,pc KillDisplay L1EA2 lda #$74 set up the loop counter sta X1E13 stow it in a temp ldx #$42B5 load base addr of data to work with KillLoop L1EAA fdb Zlda_x lda 0,x lbmi KDNext value negative ? skip processing and go again cmpa #$64 lblo L1F35 adda X1E22 fdb Zsta_x sta 0,x lbpl L1F35 jsr X723C cmpx #$480A bcc Shotdown jsr X72F3 fcc "We sunk that " fcb C$NULL lda $12,x get ship index lbsr TypeShip call ship type display jsr X72F3 fcc ", Sir!" fcb C$NULL ldu #$0360 lda X04F7 ldb #4 mul leau d,u lda X1E16 sta ,u ldd X1E17 std $01,u lda $12,x sta $03,u inc X04F7 bra L1F32 Shotdown L1F07 jsr X72F3 fcc "We shot down that " fcb C$NULL lda $12,x bne L1F27 inc X04F9 bra DisplayPlane L1F27 inc X04F8 DisplayPlane L1F2A lbsr TypePlane ldb #'! $21 argument passed in b to this routine jsr X7477 L1F32 jsr X7228 L1F35 ldu $09,x ldd $01,x leay $03,x lbsr L1E1D leay $03,x ldu #$4C84 jsr X74D9 sta $0D,x stu $0E,x jsr X7556 std $0B,x KDNext L1F4F leax $15,x move our window 21 bytes dec X1E13 dec the loop counter lbpl KillLoop not done go again rts L1F5A std X4CFB store that sucker there again lsra divide d /2 rorb lsra again divide d /2 (/4) rorb lsra and again d /2 (effective /8) rorb lda #$01 load a one and stow it sta X02A4 used in subroutine we call jmp X7889 uses b (jump instead of jsr) ByteTbl1 L1F6B fcb $01,$02,$01,$01 fcb $03,$04,$02,$02 fcb $01,$01,$01 Sub6 L1F76 fcc "sub/sub6" fcb C$NULL Radar L1F7F fcc "sub/radar.dat" fcb C$NULL Status L1F8D fcc "sub/status.dat" fcb C$NULL STitle L1F9C fcc "sub/stitle.pic" fcb C$NULL Sub1 L1FAB fcc "sub1" fcb C$NULL Subsz equ *-Sub1 Sub2 L1FB0 fcc "sub2" fcb C$NULL Sub3 L1FB5 fcc "sub3" fcb C$NULL Sub4 L1FBA fcc "sub4" fcb C$NULL Sub5 L1FBF fcc "sub5" fcb C$NULL Shell L1FC4 fcc "shell" fcb C$NULL emod eom L1FCD equ * end