Mercurial > hg > Members > kono > nitros9-code
view 3rdparty/packages/subsim/sub1.asm @ 1496:ae1f95eb053b
Removed more modules, fixed others
author | boisy |
---|---|
date | Tue, 23 Dec 2003 23:51:23 +0000 |
parents | 0de024ea86cd |
children |
line wrap: on
line source
******************************************************************** * sub1 - Sub1 Sub Battle Simulator subroutine * * $Id$ * * There is a lot of extraneous and unneccessary instructions throughout * the code. But since we use the jump table at module enter be careful * when removing any thing and adjust it accordingly. * No explicit edition byte in source. * * Edt/Rev YYYY/MM/DD Modified by * Comment * ------------------------------------------------------------------ * 0 2003/03/29 Paul W. Zibaila * Disassembly of original distribution. nam sub1 ttl Sub1 Sub Battle Simulator subroutine ifp1 use defsfile endc * I/O path definitions StdIn equ 0 StdOut equ 1 StdErr equ 2 * defines for 5 bit zero offset instructions Zldb_u equ $E640 Zldb_x equ $E600 Zsta_x equ $A700 Zclr_u equ $6F40 Zclr_x equ $6F00 * misc defines for SUB SinTblSz equ $0169 CntrlSz equ $1666 SinDat equ $0126 CntrlDat equ $1E25 * class D external label equates D0001 equ $0001 D0002 equ $0002 D0003 equ $0003 D0004 equ $0004 D0005 equ $0005 D0006 equ $0006 D0007 equ $0007 D0009 equ $0009 D000D equ $000D D000E equ $000E D0010 equ $0010 D0012 equ $0012 D0013 equ $0013 D0015 equ $0015 D0030 equ $0030 * class X external label equates X0107 equ $0107 address of subroutine module entry point X0291 equ $0291 X0295 equ $0295 X0296 equ $0296 X0297 equ $0297 X0298 equ $0298 X029A equ $029A X029C equ $029C X02A3 equ $02A3 side FF = german 23 = American X0355 equ $0355 X04F0 equ $04F0 X04F2 equ $04F2 X04F4 equ $04F4 X04F5 equ $04F5 X04F7 equ $04F7 X04F8 equ $04F8 X04F9 equ $04F9 X04FA equ $04FA X04FB equ $04FB X04FC equ $04FC X04FD equ $04FD X04FE equ $04FE X04FF equ $04FF X0500 equ $0500 X05CE equ $05CE X1D3F equ $1D3F X1D41 equ $1D41 X1D44 equ $1D44 X1D46 equ $1D46 X1D47 equ $1D47 X1D49 equ $1D49 IT.EKO original value (echo) X1D4A equ $1D4A IT.PAU original value (end of page pause) X1D6D equ $1D6D X1D76 equ $1D76 X1D88 equ $1D88 X1D89 equ $1D89 X1D8B equ $1D8B X1D8F equ $1D8F X1D91 equ $1D91 X1D93 equ $1D93 X1D95 equ $1D95 X1DA5 equ $1DA5 X1DA7 equ $1DA7 X1DAD equ $1DAD X1DAF equ $1DAF X1DB9 equ $1DB9 X1DD9 equ $1DD9 temp storage for path num X1DDA equ $1DDA X1DF6 equ $1DF6 X1DF9 equ $1DF9 X1E13 equ $1E13 X1E16 equ $1E16 year value X1E17 equ $1E17 X1E1D equ $1E1D X1E1E equ $1E1E X1E20 equ $1E20 X1E22 equ $1E22 X1E23 equ $1E23 X1E24 equ $1E24 X4265 equ $4265 X4C75 equ $4C75 side 0=German 1=US X4C76 equ $4C76 game type X4C77 equ $4C77 game level X4C78 equ $4C78 X4C7A equ $4C7A X4C80 equ $4C80 X4C81 equ $4C81 X4C82 equ $4C82 X4C83 equ $4C83 X4C84 equ $4C84 X4C85 equ $4C85 X4C87 equ $4C87 X4C88 equ $4C88 X4C90 equ $4C90 X4CA0 equ $4CA0 X4CA1 equ $4CA1 X4CA4 equ $4CA4 X4CA6 equ $4CA6 X4CA8 equ $4CA8 X4CA9 equ $4CA9 X4CAA equ $4CAA X4CAB equ $4CAB X4CAC equ $4CAC X4CB1 equ $4CB1 X4CB2 equ $4CB2 X4CB3 equ $4CB3 X4CB4 equ $4CB4 X4CBD equ $4CBD X4CCC equ $4CCC X4CCD equ $4CCD X4CCE equ $4CCE X4CCF equ $4CCF X4CE0 equ $4CE0 X4CEE equ $4CEE X4CEF equ $4CEF X4CF1 equ $4CF1 X4CF3 equ $4CF3 X4CF5 equ $4CF5 X4CF7 equ $4CF7 X4CF9 equ $4CF9 X4CFB equ $4CFB X4CFD equ $4CFD X4CFF equ $4CFF X4D00 equ $4D00 X4D01 equ $4D01 X4D02 equ $4D02 X4D03 equ $4D03 X4D04 equ $4D04 X4D11 equ $4D11 X4D12 equ $4D12 X4D13 equ $4D13 X4D1B equ $4D1B X4D1D equ $4D1D X4D1F equ $4D1F X4D21 equ $4D21 X4D22 equ $4D22 X4D27 equ $4D27 X4D28 equ $4D28 X4D29 equ $4D29 X4D2B equ $4D2B X4D2E equ $4D2E radio status X4D3B equ $4D3B X4D3C equ $4D3C new side value X4D3D equ $4D3D X4D3E equ $4D3E X71B1 equ $71B1 * subroutines in sub6 that get loaded into the data area X72C3 equ $72C3 X72F3 equ $72F3 seems to proceed character strings X7304 equ $7304 calcs an integer based on input in d X735B equ $735B Change palette routine X7477 equ $7477 some sort of copy routine accepts acsii between $20-$5F ??? X74CC equ $74CC X74D9 equ $74D9 X7691 equ $7691 X76A4 equ $76A4 X76B9 equ $76B9 X7747 equ $7747 X77E5 equ $77E5 X782E equ $782E 2 place formatted integer output based on input in b X7843 equ $7843 X7866 equ $7866 X7BF4 equ $7BF4 tylg set SbRtn+Objct atrv set ReEnt+rev rev set $01 *edition set $01 mod eom,name,tylg,atrv,start,size * OS9 data area definitions size equ . name fcs "sub1" * fcb edition no edition byte included in orig code * b contains an offset passed by call to smap start leax >JumpTbl,pcr ldd b,x index to subroutine offset ldx X0107 holds the address of start from smap call jmp d,x nuttin' to it but to jump to it JumpTbl L001C fdb GoOpts-start $0023 fdb GameSetup-start $0FC5 fdb Read_mission-start $0A05 fdb MakeFile-start $0880 fdb ReadNewFile-start $08BC fdb L0479-start $0468 fdb Read_mission2-start $0B42 fdb SetParms2-start $0547 fdb XmtSOS-start $0DF1 fdb Return2Sea-start $1243 fdb TransferTorp-start $145C fdb XmtPOS-start $0E3C GoOpts lbsr GetOPts ldd #$0073 std X1DAF ldd #$00F4 std X1DAD * 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 >SinTbl,pcr os9 I$Open pshs a save that path number * 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) ldx #SinDat ldy #SinTblSz os9 I$Read load it in data puls a clean up stack * Close Path - Terminates I/O path * (performs an impledd I$Detach call) * entry: * a -> path number * * error: * CC -> Carry set on error * b -> error code (if any) os9 I$Close lda #READ. leax >Font,pcr os9 I$Open pshs a No need for this here * Seek - Repositions a file pointer * entry: * a -> path number * x -> MS 16 bits of the desired file position * u -> LS 16 bits of the desired file position * * error: * CC -> Carry set on error * b -> error code (if any) ldx #0 ldy #0 No need for this here ldu #$0103 file position os9 I$Seek ldx #$4D3F save address ldy #$0308 num of bytes to read lda ,s get the path ?? should still be set os9 I$Read puls a get that same path number no need os9 I$Close close the file inc X4C75 increment side ? lbsr GetMisDat lbsr GetSubStat lbsr GetShipmap lbsr GetMap lbsr GetConvoy lbsr SetParams lbsr SetMorePars lda #2 sta X05CE ldd #$0004 std X1D44 ldd #$1234 std X1D3F std X1D41 lbra GetControl1 os9 F$Exit GetMap L00B8 pshs a,b,x,y,u lda #READ. tst X4C75 test the side value 0=German 1=US bne MapUS leax >Germap,pcr ldy #$0A9D number of bytes to read when the file is open bra LoadMap MapUS L00CB leax >USAmap,pcr ldy #$094E number of bytes to read when the file is open LoadMap L00D3 pshs y number of bytes to read when the file is open os9 I$Open open it ldy ,s once again number of bytes to read when the file is open pshs a save the path ldx #CntrlDat Set the addr to store the info lda ,s get the path ??? os9 I$Read do the read puls a pull the path os9 I$Close close the path * decode and put it in memory puls y get that number of bytes to read when the file is open leay -$01,y drop it by one ldx #CntrlDat address where stored (from addr) ldu #$05CF destination address lbsr Decode_copy puls a,b,x,y,u,pc GetMisDat L00F9 pshs a,b,x,y,u lbsr Set_75 clr X4D27 lda #READ. leax >Mis_dat,pcr os9 I$Open sta X1DD9 stow path number lbsr L019A ldb X02A3 load the Side value lda #$33 mul tfr d,u LS 16 bits of file position ldx #0 MS 16 bits of file position lda X1DD9 get our path number os9 I$Seek reset the file pointer ldx #$4C8A address to store the data ldy #$0033 number of bytes to read lda X1DD9 get the path number (not needed) os9 I$Read read the data from the file lda X1DD9 get the path number again (not needed) os9 I$Close close the file ldb X4CA8 decb lslb leax >ByteTbl4,pcr ldd b,x addb X4CA9 adca #0 std X1E17 ldb X4CAA stb X1E16 year value ldb X4CAB tst X4C76 test game type value once bne L015A not target practice lbsr L021B was target practice ldb #$10 on return load b L015A stb X4D22 always stow b either from X4CAB or a fixed value of $10 tst X4C76 test that game type value again beq Ext_MD if zero we're done ldb X4CA0 lbmi Ext_MD2 if negative were done lda #$09 otherwise multiply by 9 mul leax >ByteTbl3,pcr load pointer to bytetable leax d,x index into it and use that as copy from addr ldy #$4C63 set destination address to copy to bsr Copy_9 copy 9 bytes ldb X4CA1 bmi Ext_MD2 if negative we're done lda #$09 same as above for 9 more bytes mul leax >ByteTbl3,pcr leax d,x ldy #$4C6C bsr Copy_9 Ext_MD L018C puls a,b,x,y,u,pc Copy_9 L018E lda #$09 for the use only twice I would have inlined this snippet Loop_9 L0190 ldb ,x+ stb ,y+ deca bne Loop_9 rts Ext_MD2 L0198 puls a,b,x,y,u,pc L019A pshs a,b,x,y,u ldb X4C76 check that game type value again cmpb #$02 is it a 2 War Time Command ? lbeq inc2 if so head for inc & inc tst X4C76 check that game type value again bne L01B9 not target practice branch ldb #$24 set some men loactaions with $ stb X02A3 the side value stb X4D3B lda #$01 US sta X4C75 set side value puls a,b,x,y,u,pc L01B9 ldb X1E16 year value cmpb X4D3D new year value bne L01D7 not equal branch to next sub ldb X4C75 side value cmpb X4D3C new side value bne L01D7 not equal branch to next sub ldb X02A3 Side value incb bump it cmpb X4D3B compare to mate beq L01D7 if equal branch to next sub stb X02A3 if not stow b at side value puls a,b,x,y,u,pc L01D7 ldb X4C75 side value stb X4D3C new side value ldb X1E16 year value stb X4D3D new year value subb #39 start year german b used as index below lda X4C75 side value cmpa #0 German ? bne Loadtb leax >ByteTblA,pcr German bra Gotta Loadtb leax >ByteTblB,pcr American Gotta lda b,x sta X02A3 side value incb bump b by one lda b,x index into x again sta X4D3B stow that puls a,b,x,y,u,pc inc2 inc X02A3 side value inc X4D3B puls a,b,x,y,u,pc ByteTblA L020B fcb $00,$02,$09,$0F,$15,$1B,$21,$24 ByteTblB L0213 fcb $00,$00,$00,$24,$2E,$32,$39,$3C L021B pshs a,b,x,y,u ldb #$FF set b to $FF ldx #$4C8A start address to set bytes Loop25 stb ,x+ set byte and bump pointer cmpx #$4CA4 have we moved 25 bytes? blo Loop25 nope loop again ldd #0000 I'm sure there is a reason these std X4CA4 jump all over the place std X4CA6 but it sure isn't self evident clr X4C90 ldb #$05 stb X4CB1 ldb #$10 stb X4CAB clr X4CB3 clr X4CB4 ldx #$0579 ldb #$06 stb $01,x lda #$60 sta $02,x sta X1DF6 ldd #$0064 std $03,x lda #$7F sta $05,x sta X1DF9 ldd #$3FFF std $06,x clr $12,x this gets overwritten below clr $08,x * $09.x is not manipulated leax $0A,x so now x is pointed to $0583 ldd #$0108 this is cute a=$01 b=$08 Set8 sta ,x+ set 8 bytes to 1 decb dec the counter bne Set8 * so when we're finished here starting $0580 we have * 0580 $06,$60,$00,$64,$7F,$3F,$FF,$00 * 0588 ??,$01,$01,$01,$01,$01,$01,$01 * 0590 $01,$01 clr X0296 ldd #$0320 std X1D6D lbsr L0479 branch down and set some more based at $0579 puls a,b,x,y,u,pc GetSubStat L0281 pshs a,b,x,y,u lda #$FF sta X0295 lda #READ. leax >SubStat,pcr os9 I$Open sta X1DD9 stow the path num lda X4CB1 First read of sub stats ldb #$22 mul ldx #0 MS 16 bits of file position tfr d,u LS 16 bits of file position lda X1DD9 get the path num os9 I$Seek reset file pointer to the head of the file ldx #$4CCC destination address ldy #$0022 number of bytes to read lda X1DD9 get that pesky path number (not needed) os9 I$Read read the data lda X4CB2 second read of sub stats ldb #$0D mul addd #$00CC ldx #0 MS 16 bits of file position tfr d,u LS 16 bits of file position lda X1DD9 get path num os9 I$Seek position the file pointer ldx #$4CBD destination address ldy #$000D number of bytes to read lda X1DD9 get the path num (not needed) os9 I$Read read the data lda X4C75 test side value cmpa #0 is it zero? German beq Geroff if so branch to get next file pos ldu #$0134 LS 16 bits of file position bra SetMS1 go get the MS word Geroff ldu #$01AC LS 16 bits of file position SetMS1 ldx #$0000 MS 16 bits of file position lda X1DD9 get path num os9 I$Seek position the file pointer ldx #$0501 destination addr ldy #$0078 number bytes to read lda X1DD9 get path num os9 I$Read read the data lda X4C75 test side for next read value cmpa #0 German ? beq Geroff2 set up next seek ldu #$0224 LS word of pos bra SetMS2 go set MS word Geroff2 ldu #$02A2 LS word of pos SetMS2 ldx #$0000 MS word of pos lda X1DD9 get the path num os9 I$Seek set the file pointer ldx #$02B7 destination address ldy #$007E number of bytes to read lda X1DD9 get the path num (not needed) os9 I$Read fetch the data lda X1DD9 get the path num (not needed) os9 I$Close close the file ldx #$4A80 load base addr for offset index addressing ldu #$02B7 load base addr for offset index addressing ldb #$06 pshs b Transtat L032D fdb Zclr_x clr 0,x lda $01,u sta $03,x ldd $02,u std $04,x lda $04,u sta $06,x ldd $05,u std $07,x ldd #0 set up to clr word std $01,x std $09,x leax $15,x bump pointer by 21 leau $15,u dec ,s dec the counter bne Transtat gone 6 times ? nope loop again puls b clean up stack lda #$05 lbsr SetByte ldb X1E16 load year value tst X4C75 test side value 0=German 1=US lbne tst2A test value not zero skip to compare b $2A cmpb #$27 is it 39 ? bne tst28 nope goto next test lda #2 lbsr SetByte lda #3 lbsr SetByte lda #4 lbsr SetByte lbra ExtSubStat tst28 cmpb #$28 is it 40 ? bne tst29 nope go to next test lda #2 lbsr SetByte ldd X1E17 cmpd #$005A lbgt ExtSubStat lda #3 lbsr SetByte lbra ExtSubStat tst29 cmpb #$29 is it 41 ? bne tst2a lbra ExtSubStat tst2a cmpb #$2A is it 42 ? bne tst2b lbra ExtSubStat tst2b cmpb #$2B is it 43 ? bne tst2c tst X4C75 test side value beq ExtSubStat german ? lda #4 lbsr SetByte lbra ExtSubStat tst2c cmpb #$2C is it 44 ? bne tstlst tst X4C75 lbne ExtSubStat ldd X1E17 cmpd #$0099 lbls ExtSubStat L03C8 lda #2 lbsr SetByte lda #4 lbsr SetByte lda #3 lbsr SetByte lbra ExtSubStat tstlst tst X4C75 beq L03C8 lda #5 ldb #$15 mul ldx #$4A80 leax d,x fdb Zclr_x clr 0,x ExtSubStat L03EB puls a,b,x,y,u,pc * a is passed by caller * Calcs an offset from base addr and sets it to FF * SetByte L03ED pshs a,b,x,y,u ldb #$15 mul ldx #$4A80 leax d,x lda #$FF fdb Zsta_x puls a,b,x,y,u,pc GetConvoy L03FD pshs a,b,x,y,u lda X4C76 check the game type byte bne ReadConvoy not target practice puls a,b,x,y,u,pc ReadConvoy L0406 leax >Convoys,pcr lda #READ. os9 I$Open sta X1DD9 save that path num ldx #$4C90 set up destination addr ldy #$0579 addr for inner loop RCLop2 ldb #4 loop counter pshs b push on the stack RCloop ldb ,x+ get the first byte at 4C90 and bump the pointer lbmi RCLend go to loop end lda #$16 calc the seek position mul tfr d,u LS Word file pos pshs x,y save destination and bytes to read ldx #0 MS Word file pos lda X1DD9 path num os9 I$Seek reset the file pointer ldx $02,s get the val off the stack ldy #$0016 bytes to read lda X1DD9 path num os9 I$Read fetch the data puls x,y grab the old x and y ldb #3 set up an inner loop RCLop2 pshs b push the counter on the stack ldb $02,y get the third byte at y addb #$3B add to it tst X4C75 test side value beq RCx1 if zero (german) stow it and get new thing to work on addb #$15 otherwise add some more to it then RCx1 stb $02,y stow it back ldb $05,y get the next one to work with addb #$27 add to it tst X4C75 check that side value beq RCx2 if zero (german) stow that and cycle the loop addb #$0B otherwise add some more then RCx2 stb $05,y stow it back leay $01,y bump pointer +1 puls b pull the loop counter decb decrement it bne RCLop2 loop if we haven't gone 3 times leay -$03,y after 3 loops move y back to start of inner loop value RCLend leay $16,y set y up for the next $16 byte read dec ,s dec the outer loop counter bne RCloop not gone four times ? loop again puls b otherwise clean up stack lda X1DD9 get that good old path number os9 I$Close and close the file puls a,b,x,y,u,pc return * what do I do in the great scheme of things??? L0479 pshs a,b,x,y,u our generic save all ldb X0296 lda #$16 mul calc an offset ldx #$0579 get the base address leax d,x set the pointer to base + offset lda $04,x bpl PosVal is it positive ? branch lda $02,x otherwise shift a couple bytes sta $04,x first then go on lda $05,x sta $07,x PosVal lda #$01 sta $08,x ldb X0296 lbsr L04AF lda #$07 outer loop counter leau $0A,x load u with x+10 Outloop ldb a,u load b with u+counter (inner counter) beq Decout is it zero branch out In_loop lbsr L04DA not zero decb dec inner counter bne In_loop Decout deca bpl Outloop puls a,b,x,y,u,pc * value passed in b from caller L04AF pshs a,b,x,y,u ldu #$4A02 set base offset lda #$15 compute offset mul leau d,u set base + offset fdb Zclr_u clear the byte at u clr $10,u ldd X1DF6 std $03,u ldd X1DF9 std $06,u ldd X1D6D std $09,u ldb 1,x could have pulled x off the stack clra instead of mucking around with u std $01,u stx $12,u stu X71B1 stow $4a02 at 71b1 puls a,b,x,y,u,pc L04DA pshs a,b,x,y,u ldb #$41 stb X1E13 ldu #$42B5 set base address L04E4 fdb Zldb_u ldb ,u bpl L053D pshs x we've pushed it once leax >ByteTblF,pcr lda a,x sta $12,u puls x fdb Zclr_u clr ,u clr $10,u ldd X1DF6 std $03,u ldd #$1FFF jsr X76A4 addd $04,u std $04,u ldd X1DF9 std $06,u ldd #$1FFD jsr X76A4 addd $07,u std $07,u ldd X1D6D std $09,u ldb $01,x clra std $01,u ldd X71B1 std $13,u pshs u leay $03,u ldu #$4C84 jsr X74D9 tfr u,y puls u sty $0E,u sta $0D,u puls a,b,x,y,u,pc L053D leau $15,u dec X1E13 lbne L04E4 puls a,b,x,y,u,pc * reads a byte from std in not explicitly called N0549 pshs a,b,x,y,u clra ldx #$1DDA ldy #1 os9 I$Read puls a,b,x,y,u,pc SetParms2 L0558 pshs a,b,x,y,u lda X4C80 cmpa #3 beq ExtSP2 if three were done inca bump a sta X4C80 and save it back ldx #$4CA4 set up index tst a,x test bne SetP2 lda #$FF sta X4C80 bra ExtSP2 SetP2 lda #4 sta X4C81 ExtSP2 L0578 puls a,b,x,y,u,pc * Not labeled by the disassembler N057A pshs y,u ldy #$1E0D ldu #$4C84 jsr X74D9 lsra lsra puls y,u,pc SetParams L058A pshs a,b,x,y,u ldd #0 zero (clear) these words std X4C78 std X4C7A ldb #$FF set these bytes stb X4D2B stb X4C80 lda #$FF switching from accb to acca makes no sense sta X4D28 clr X4D11 clear these bytes clr X4D29 clr X4C82 clr X0500 clrb now we clear an acc stb X4CEE and store the val at these stb X0355 stb X0298 lbsr SetParms2 call a sub to set some others lda #$0A sta X1D47 lda #1 sta X1D46 lda #$3C sta X1D76 ldb #$63 stb X4D12 stb X4D13 ldd #$6300 std X4D1F std X4D1B std X4D1D lda X4CE0 sta X4D21 ldb X4CCF stb X4D00 ldb X4CCE stb X4CFF addb X4CCF cmpb X4CAC bls Setpar2 ldb X4CCD stb X4D00 lda X4CAC suba X4CCD sta X4CFF Setpar2 lda X4CCC sta X4D01 lda X4CCD sta X4D02 clr X4D03 clr X4D04 ldd #1 std X1E1E std X1E20 stb X1E22 clr X1E1D ldy #0 SPLoop clr $4D2D,y leay 1,y cmpy #$000E bcs SPLoop clr X4CEE tst X4C76 test game type value bne Setpar3 not target practice clr X4C81 lda #$5F sta X4C84 lda #$7F sta X4C87 ldd #$E678 std X4C85 ldd #$4E20 std X4C88 puls a,b,x,y,u,pc Setpar3 L065B ldb X4CB3 lda #$15 mul ldx #$02B7 leax d,x calc an index fdb Zldb_x to calc an index lda #$04 mul std X4CFB stow that value std X4CF3 std X4CFD std X4CF5 ldb $01,x get bytes at the pointer stb X4C84 and save them elsewhere ldd $02,x std X4C85 ldb $04,x stb X4C87 ldd $05,x std X4C88 puls a,b,x,y,u,pc SetMorePars L068D pshs a,b,x,y,u ldx #$4A56 lda #$FF fdb Zsta_x leax $15,x fdb Zsta_x lda X4C77 game level leax >ByteTblC,pcr ldb a,x stb X1E23 leax >Gstring,pcr ldb a,x stb X1E24 always a G ldd X4CBD ldu #3 jsr X76B9 std X1DDA ldb X4C77 game level clra zero ms byte tfr d,y transfer game level to y ldd X4CBD cmpy #$0003 Expert level ? beq ExtSMP addd X1DDA cmpy #$0002 Advanced level ? beq ExtSMP1 addd X1DDA cmpy #$0001 Intermediate level ? beq ExtSMP1 addd X1DDA must be Novice ExtSMP1 std X4CBD ExtSMP L06E3 puls a,b,x,y,u,pc ByteTblC L06E5 fcb $14,$19,$1E,$2D Gstring L06E9 fcc "GGGG" all bytes $47 GetShipmap L06ED pshs a,b,x,y,u lda #READ. leax >Shipmap,pcr os9 I$Open sta X1DD9 stow the path num ldx #$5041 destination address ldy #$0050 number of bytes to read os9 I$Read fetch the data pshs a,x,u why ?? ldx #0 MS Word of file pos ldu #$0C9D LS Word of file pos lda X1DD9 path num os9 I$Seek reset file pointer puls a,x,u pull what we just saved and then over write it ldx #$5091 destination address ldy #$1135 bytes to read lda X1DD9 get the path num os9 I$Read fetch the data tst X4C75 test side value bne Shpmap2 Not German pshs a,x,u duh ldx #0 MS Word of file pos ldu #$0080 LS Word of file pos lda X1DD9 load the same path num os9 I$Seek reset the file pointer puls a,x,u pull em and overwrite em ?? ldx #$61C6 destination ldy #$0C1D number of bytes to read lda X1DD9 path num os9 I$Read fetch the data pshs a,x,u duh ldx #0 MS Word of file pos ldu #$2A9C LS Word of file pos lda X1DD9 get that path num os9 I$Seek reset the file pointer puls a,x,u pull em and over write them duh ldx #$6DE3 destination addr ldy #$0230 number of byets to read lda X1DD9 same path num again os9 I$Read fetch the data bra Shpmap3 Shpmap2 pshs a,x,u ldx #0 MW Word of file pos ldu #$0050 LS Word of file pos lda X1DD9 path num os9 I$Seek reset the file pointer puls a,x,u waste of time ldx #$5061 destination addr ldy #$0030 number of byets to read lda X1DD9 path num os9 I$Read pshs a,x,u waste of time ldx #0 MW Word of file pos ldu #$1DD2 LS Word of file pos lda X1DD9 path num os9 I$Seek reset the file pointer puls a,x,u waste of time ldx #$61C6 destination addr ldy #$0CCA number of byets to read lda X1DD9 path num os9 I$Read pshs a,x,u waste of time ldx #0 MW Word of file pos ldu #$2CCC LS Word of file pos lda X1DD9 path num os9 I$Seek reset the file pointer puls a,x,u waste of time ldx #$6E90 destination addr ldy #$02CA number of byets to read lda X1DD9 path num os9 I$Read Shpmap3 lda X1DD9 its the same stinking path num all along ... os9 I$Close puls a,b,x,y,u,pc GetFile pshs a ldd #0000 jsr X77E5 jsr X7747 ldd #$0039 std X1DA7 ldd #$0050 std X1DA5 jsr X72F3 this writes the strings? fcc "Enter Filename: " fcb C$NULL fcb $CC fcb C$NULL fcb $45 std X1DA7 ldd #$0056 std X1DA5 jsr X72F3 this writes the strings? fcc "->" fcb C$NULL clr X4265 lbsr GetKBinp puls a,pc GetKBinp L0807 pshs a,x,y,u ldx #$4265 base addr to store data jsr X74CC leax -$01,x ReadKey lbsr L087F clra set path stdin pshs x address to store data ($4264) ldy #$01 get one byte os9 I$Read fetch the byte puls x no need for this ldb ,x load b with the keyboard value cmpb #C$BSP is it a back space ? (ctrl-h) lbeq IsBSP cmpb #C$EOF is it an ESC (ctrl-break) lbeq IsEOF cmpb #C$QUIT is it ENQ (ctrl-e) lbeq IsEOF tst X029C lbne IsEOF cmpb #C$CR carriage return lbeq EndKey * argument passed in b to this routine jsr X7477 some sort of copy routine ?? cmpx #$4275 so we read 16 bytes ? blo NextKey bump x and read again ldy X1DA5 leay -$08,y sty X1DA5 lbra ReadKey NextKey leax $01,x bump x by one lbra ReadKey read the next key press IsBSP cmpx #$4265 lbeq ReadKey leax -$01,x ldb #C$SPAC * argument passed in b to this routine jsr X7477 some sort of copy routine ?? ldy X1DA5 leay -16,y sty X1DA5 lbra ReadKey EndKey clr X029C puls a,x,y,u,pc IsEOF ldb #C$EOF bra EndKey L087F pshs a,b ldb #'_ $5F * argument passed in b to this routine jsr X7477 some sort of copy routine ?? ldd X1DA5 subd #$08 std X1DA5 puls a,b,pc * Not explicitly called not labeled by disasm MakeFile N0891 pshs a,b,x,y,u lbsr GetFile cmpb #C$EOF lbeq DontMake * Delete File - Deletes a specified disk file * * entry: * x -> address of the path list * * exit: * x -> address of the last btye of the path list + 1 * * error: * CC -> Carry set on error * b -> error code (if any) ldx #$4265 pointer to file name string os9 I$Delete delete file if exsits * Create File - Creates and opens a disk file * * entry: * a -> access mode (write (2) or update (3)) * b -> file attributes * Bit Definition * 0 Read * 1 Write * 2 Execute * 3 Public Read * 4 Public Write * 5 Public Execute * 6 Shareable file * 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) ldx #$4265 pointer to file name string ldd #(WRITE.*$100)+READ.+WRITE.+PREAD.+PWRIT.+SHARE. $025B os9 I$Create create the file bcs CallErr if error occured call error handler sta X1DD9 store the path number * Write - Writes to a file or device * * entry: * a -> path number * x -> starting address of the data to write * y -> number of bytes to write * exit: * y -> number of bytes written * * error: * CC -> Carry set on error * b -> error code (if any) * path still set from create call ldx #$0109 starting address of data ldy #$7E04 number of bytes to write os9 I$Write move the data bcs CallErr if error occured call error handler lbra NoError CallErr lbsr ErrMsg NoError lda X1DD9 load the path number os9 I$Close close the file DontMake L08C8 inc X0297 puls a,b,x,y,u,pc ReadNewFile N08CD pshs a,b,x,y,u lbsr GetFile cmpb #C$EOF lbeq NoFile ldu X1D8B we overwrite this below pshs u so we save it now ldx #$4265 address of path list lda #READ. access mode os9 I$Open open the filr bcs CallEr2 if error occured call error handler sta X1DD9 stow the path number * Get status - Returns the status of a file or device * Wildcard call exit status differs based on cal code * entry: * a -> path number * b -> function code 2 (SS.Size) * * exit: * x -> MS 16 bits of the current file size * u -> LS 16 bits of the current file size * * error: * CC -> Carry set on error * b -> error code (if any) * ldb #SS.Size get the curent file size os9 I$GetStt make the call tfr u,x move u to x but why ?? cmpu #$7E04 check the file size beq Readfile if it's the right size go read it ldb #E$Btyp otherwise wrong type error lbra CallEr2 ReadFile L08FC lda X1DD9 load the path num ldx #$0109 addr to stow data ldy #$7E04 bytes to read os9 I$Read make the call bcs CallEr2 lbra NoErr CallEr2 lbsr ErrMsg NoErr puls u get our old value stu X1D8B and return it ldx #$1E25 stx X1D89 lda X1DD9 l Looks like this gets overwriten too? * $0109 + $7E04 = $7F0D os9 I$Close close the file NoFile inc X0297 puls a,b,x,y,u,pc * b contains error code from calling routine ErrMsg pshs a,b,x,y,u ldx #$0050 stx X1DA5 ldx #$0039 leax 16,x stx X1DA7 jsr X72F3 this writes the strings? fcc "ERROR #" fcb C$NULL pshs b clra jsr X7304 calcs a integer based on input in d jsr X72F3 this writes the strings? fcc " : " fcb C$NULL puls b cmpb #E$Btyp bad type ?? bne ChkBPth jsr X72F3 this writes the strings? fcc "WRONG FILE TYPE" fcb C$NULL fcb C$CLSALL flag to skip # of bytes after next null fcb C$NULL fcb $54 ChkBPth cmpb #E$BPNam bad path name bne ChkPNF jsr X72F3 this writes the strings? fcc "BAD PATHNAME" fcb C$NULL fcb C$CLSALL flag to skip # of bytes after next null fcb C$NULL fcb $3D ChkPNF cmpb #E$PNNF path not found bne ChkDrv jsr X72F3 this writes the strings? fcc "FILE NOT FOUND" fcb C$NULL fcb C$CLSALL flag to skip # of bytes after next null fcb C$NULL fcb $24 ChkDrv cmpb #E$Unit Illegal drive num blt SomERR none of the above and less than E$Unit * E$Unit and greater yields disk error of some kind jsr X72F3 this writes the strings? fcc "DISK ERROR" fcb C$NULL fcb $20 fcb $10 this will skip over SomERR msg string SomERR jsr X72F3 this writes the strings? fcc "SYSTEM ERROR" fcb C$NULL ldx X1DA7 leax 16,x stx X1DA7 ldx #$0060 stx X1DA5 jsr X72F3 this writes the strings? fcc "Press any key to continue" fcb C$NULL * after a string write byte after second null sends to here clra set stdin ldx #$1DDA addr to save byte ldy #$01 only need one os9 I$Read get the input puls a,b,x,y,u,pc we're done here return to caller Zero_txt_area L09F9 pshs a,b,x,y,u ldx #$1E25 clears $2440 bytes ldd #$0000 ClrLoop std ,x++ cmpx #$4265 blt ClrLoop ldd #$0008 std X1DA5 ldd #$0002 std X1DA7 puls a,b,x,y,u,pc Read_mission L0A16 pshs a,b,x,y,u lbsr Zero_txt_area clear mission text area leax >Mis_txt,pcr get the name of the file to open lda #READ. in read only mode os9 I$Open open the file sta X1DD9 path number ldu #$4CB5 base addr ldb X0298 get value stored lslb multiply by 2 tst X4C76 check that game type byte bne L0A35 not target practice use this byte as offset ldb #$06 is target practice use a +6 offset L0A35 ldu b,u LS Word of file seek ldx #$0000 MS Word of file seek lda X1DD9 get the path number which should still be in a os9 I$Seek repostion file pointer ldx X1D8B pshs x ldx #$1E25 stx X1D8B L0A4B ldx #$4265 addr to stow the data ldy #$01 number of bytes to read lda X1DD9 load the path number os9 I$Read read one byte ldb X4265 put that byte in b cmpb #'@ is it an @ $40 lbeq L0A8D cmpb #'% is it a % $25 lbeq L0A8D cmpb #C$CR is it a carriage return ? beq L0A74 cmpb #C$LF is it a line feed beq L0A7D * argument passed in b to this routine jsr X7477 nope then some sort of copy routine ?? bra L0A4B loop again L0A74 ldd #$0008 std X1DA5 lbra L0A4B L0A7D ldx X1DA7 leax $08,x cmpx #$006B bge L0A74 stx X1DA7 lbra L0A4B L0A8D lda X1DD9 get the path num and os9 I$Close close the file puls x stx X1D8B bsr SetandSwap lbsr MVMissn puls a,b,x,y,u,pc SetandSwap L0A9F pshs a,b,x,y,u lda #$FF sta X0297 lda #$03 sta X1D88 ldd X1D8B pshs d ldd #$1E25 std X1D8B ldd X1DAD pshs d ldd #$013F std X1DAD ldd #$0000 std X1D8F std X1D91 std X1D95 ldd #$013F std X1D93 jsr X7BF4 std X1D93 ldd #$0000 std X1D8F ldd #$0073 std X1D91 std X1D95 jsr X7BF4 ldd #$0000 std X1D8F std X1D91 std X1D93 ldd #$0073 std X1D95 jsr X7BF4 std X1D95 ldd #$013F std X1D8F std X1D93 ldd #$0000 std X1D91 jsr X7BF4 puls d,x std X1DAD stx X1D8B ldx #$1E25 address 1 ldu X1D8B address 2 ldy #$2440 number of bytes to swap L0B27 ldb ,x get a byte from each lda ,u stb ,u+ swap them and bump pointers sta ,x+ leay -$01,y decrement the counter bne L0B27 loop till we are finished puls a,b,x,y,u,pc MVMissn pshs a,b,x,y,u clra stdin path ldx #$4265 address to save data ldy #$01 bytes to read os9 I$Read read byte ldu X1D8B get save address ldx #$1E25 get from address MVLoop ldd ,x++ load a word from x and bump by a word std ,u++ stow that word at u and bump by a word cmpx #$4265 have we gotten to the end ?? blt MVLoop nope loop again puls a,b,x,y,u,pc * Not explicitly called not labeled by disasm * similar to Read_mission at L0A16 Read_mission2 N0B53 pshs a,b,x,y,u lda #$FF sta X0297 clr X4D3E ldx #$1E25 clear the bytes between $1E25 - $4265 ldd #$0000 L0B63 std ,x++ cmpx #$4265 blt L0B63 lbsr SetandSwap so now we swap the cleared bytes ldd #$0008 std X1DA5 ldd #$0002 std X1DA7 leax >Mis_txt,pcr lda #READ. os9 I$Open sta X1DD9 save path num ldu #$4CB5 base address ldb X0298 get stored value lslb multiply by two tst X4C76 check that game type byte bne L0B93 not target practice use this value ldb #$06 otherwise is target practice use a +6 offset L0B93 ldu b,u LS word of file position to seek ldx #$0000 MS word of file positioin to seek lda X1DD9 get the path num that is still in a os9 I$Seek reset the file pointer L0B9E ldx #$4265 addr to stow data ldy #$01 get one byte lda X1DD9 get that path numm that's already there os9 I$Read read a byte ldb X4265 load it in b cmpb #'@ is it an @ $40 lbeq ClsMisTx cmpb #'% is it a % $25 lbeq ClsMisTx cmpb #C$CR beq L0BD5 cmpb #C$LF beq L0BDE tst X4D3E bne L0BD0 lbsr InpReady sta X4D3E lbsr MCode * argument passed in b to this routine L0BD0 jsr X7477 some sort of copy routine ?? bra L0B9E loop again L0BD5 ldd #$0008 std X1DA5 lbra L0B9E loop again L0BDE ldx X1DA7 leax $08,x cmpx #$006B bge L0BD5 stx X1DA7 lbra L0B9E loop again ClsMisTx L0BEE lda X1DD9 os9 I$Close lbsr MVMissn puls a,b,x,y,u,pc InpReady L0BF9 pshs b,x,y clra set path stdin ldb #SS.Ready test if data available os9 I$GetStt make the call bcc ReadKey2 if ready go read it clra not read clear a again puls b,x,y,pc pull b back over any error code ReadKey2 L0C06 clra set path stdin ldx #$1DDA set address to hold data ldy #$01 read one byte os9 I$Read make the call lda X1DDA load the data in a cmpa #C$INTR is it a key board interrupt (ctrl-C) beq EndKey2 cmpa #C$QUIT is it a keyboard abort (ctrl-E) beq EndKey2 tst X029C bne EndKey2 puls b,x,y,pc EndKey2 L0C23 clr X029C lda #C$EOF puls b,x,y,pc Set_75 L0C2A pshs a,b,x,y,u ldy #$0075 number of bytes to set ldx #$42B5 base address lda #$FF value to set them to Loop75 fdb Zsta_x sta ,x leax $15,x bump x by $15 leay -$01,y decrement the counter lbne Loop75 are we done ? nope loop again puls a,b,x,y,u,pc GetControl1 L0C42 pshs a,b,x,y,u lda #READ. leax >Control1,pcr os9 I$Open ldx #CntrlDat address to store ldy #CntrlSz bytes to read os9 I$Read os9 I$Close close the file ldx #CntrlDat ldy #CntrlSz ldu X1D8B lbsr Decode_copy ldd #$0109 PRN,CTN jsr X735B call Change palette ldd #$0236 PRN,CTN jsr X735B call Change palette lda #$03 sta X1D88 ldx X1D8B stx X1D89 clra make a zero GCloop pshs a push it on the stack for a counter ldx #$0020 huh ? leax -$0C,x stx X1DA5 stow that leax >ByteTbl1,pcr ldb a,x clra make a zero again (still) addd #$04 add four to value loaded from ByteTbl1 std X1DA7 jsr X72F3 this writes the strings? fcc "000" fcb C$NULL puls a pull our counter inca bump it cmpa #Tbl1sz made 4 loops ?? bne GCloop nope go again clra clear a leax >ByteTbl1,pcr ldy #$02A7 GClop2 pshs a ldb #C$SPAC stb $08,y save it once stb ,y+ save it twice ldb ,x+ get the ByteTbl1 byte and bump pointer subb #$14 subtract $14 stb $08,y stb ,y+ puls a inca cmpa #Tbl1sz bne GClop2 ldd #$0000 std X4CFD std X4CF9 std X4CFB std X4CF7 std X4CF5 std X4CF1 std X4CF3 std X4CEF lbsr SetandJsr1 lbsr SetandJsr2 lbsr SetandJsr3 lbsr SetandJsr4 jsr X7843 jsr X7866 lda #$FF sta X4D28 lda #READ. leax >Diesel,pcr os9 I$Open sta X1DD9 stow the path number ldx #$0000 MS 16 bits of file pos ldu #$0072 LS 16 bits of file pos os9 I$Seek move file pointer ldd X1D8B start with some value addd #$2D63 add a big offset to it tfr d,x move it to x in prep for the read ldb #$08 Loop counter DRloop pshs b,x push em lda X1DD9 get the path num ldy #$000C read 12 bytes os9 I$Read copy the bytes puls b,x get the counter and orig destination addr leax $50,x bump it by 80 decb dec the counter bne DRloop go again if not zero lda X1DD9 get the path num os9 I$Close close the file puls a,b,x,y,u,pc Diesel L0D31 fcc "sub/diesel.dat" fcb C$NULL SetandJsr1 L0D40 pshs a,b,x,y,u ldd #$0092 std X1DA7 ldd #$00C8 std X1DA5 ldb X4D11 jsr X782E 2 place formatted output puls a,b,x,y,u,pc SetandJsr2 L0D56 pshs a,b,x,y,u ldd #$00A2 std X1DA7 ldd #$00C8 std X1DA5 ldb X4D12 jsr X782E 2 place formatted output puls a,b,x,y,u,pc * Decodes ??? and copies data * x -> from address * u -> to address Decode_copy L0D6C pshs a,b,x,y,u Decotr lda ,x+ bpl Declp2 anda #$7F leay -1,y ldb ,x+ Declp1 stb ,u+ deca bne Declp1 bra Dectr1 Declp2 ldb ,x+ stb ,u+ leay -1,y deca bne Declp2 Dectr1 leay -1,y bne Decotr puls a,b,x,y,u,pc SetandJsr3 L0D8E pshs a,b,x,y,u ldd #$00B2 std X1DA7 ldd #$00C8 std X1DA5 ldb X4D13 jsr X782E 2 place formatted output puls a,b,x,y,u,pc SetandJsr4 L0DA4 pshs a,b,x,y,u ldd #$0092 std X1DA7 ldd #$0112 std X1DA5 clra ldb X1E1D leax >ByteTblE,pcr ldb b,x jsr X782E 2 place formatted output ldx #$0128 stx X1DA5 leax >ByteTblD,pcr ldb X1E1D ldb b,x * argument passed in b to this routine jsr X7477 some sort of copy routine ?? puls a,b,x,y,u,pc ByteTblD L0DD3 fcb $53,$53,$53,$4D,$48 SSSMH ByteTblE L0DD8 fcb $01,$05,$1E,$0A,$04 * Get Status - Returns the status of a file or device * entry: * a -> path number * b -> SS.Opt (function code 00) * Reads the option section of the path descriptor, * copies it to the 32 byte area pointed to by x * x -> address to receive data packet * * error: * CC -> Carry set on error * b -> error code (if any) GetOpts L0DDD pshs a,b,x,y ldd #(StdOut*$100)+SS.Opt ldx #$4265 pshs x unneeded os9 I$GetStt puls x unneeded lda $04,x IT.EKO sta X1D49 save orig clr $04,x set it to NO echo lda $07,x IT.PAU sta X1D4A save orig value clr $07,x set it to NO pause ldd #(StdOut*$100)+SS.Opt os9 I$SetStt reset them puls a,b,x,y,pc XmtSOS N0E02 tst X4D2E beq SendSOS jsr X72C3 fcc "The radio is out, Sir" fcb C$NULL rts SendSOS L0E21 jsr X72C3 fcc "Sending S.O.S., Sir" fcb C$NULL ldb #'S lbsr MCode ldb #'O lbsr MCode ldb #'S lbsr MCode ldb #$FF stb X4C83 rts XmtPOS N0E4D tst X4D2E beq SendPOS jsr X72C3 fcc "The radio is out, Sir" fcb C$NULL rts SendPOS L0E6C jsr X72C3 fcc "Radioing position, Sir" fcb C$NULL ldb X4C84 jsr X7691 lbsr MCode jsr X7691 lbsr MCode jsr X7691 lbsr MCode ldb X4C87 jsr X7691 lbsr MCode jsr X7691 lbsr MCode jsr X7691 lbsr MCode ldb #'E cute litte Easter Egg :-) lbsr MCode ldb #'P lbsr MCode ldb #'Y lbsr MCode ldb #'X lbsr MCode ldb #$FF stb X4C83 rts * Set Status - Sets the status of a file or device * entry: * a -> path number * b -> SS.Tone (function code 98) Sound through termional output device * x -> duration and amplitude of the tone * LSB duration in ticks (60 sec) in the range of 0-255 * MSB amplitude of the tone in the range of 0-63 * y -> relative frequency counter (0 = low, 4095 = high) * exit: * Same as entry * error: * There are no error conditions set * * Therefore duration and amplitude passed in accd * freq is passed in y SoundGen L0ECA pshs a,b,x,y,u tfr d,x ldd #(StdOut*$100)+SS.Tone os9 I$SetStt puls a,b,x,y,u,pc * Looks like a morse code generator based on character input MCode L0ED6 pshs a,b,x,y,u cmpb #C$SPAC bne L0EED not a space process more lbsr TimeDly1 otherwise appropriate dead time lbsr TimeDly1 lbsr TimeDly1 lbsr TimeDly1 lbsr TimeDly1 ExtMCode puls a,b,x,y,u,pc L0EED cmpb #'' is it a tick $27 blt ExtMcode cmpb #'a blt L0EF7 whats wrong with this logic? subb #$20 make upper case L0EF7 cmpb #'z this should have been Uppercase Z * can't be less than a but greater than z bgt ExtMCode subb #$27 now we subtract the position of the ' * to be zero based in the table leax >ByteTbl2,pcr ldb b,x lda #$08 L0F05 deca lslb bcc L0F05 Sndloop lslb bcc L0F20 pshs a,b ldd #$3F04 setup sound amplitude/duration tfr d,x move it to x where it should have been ldy #$0FD7 load the freq value lbsr SoundGen make the noise bsr TimeDly1 puls a,b bra Sndcntr L0F20 pshs a,b ldd #$3F0C setup sound amplitude/duration tfr d,x move that to x where it should have been in the first place ldy #$0FD7 load with freq value lbsr SoundGen make the noise bsr TimeDly1 puls a,b Sndcntr deca bne Sndloop bsr TimeDly1 bsr TimeDly1 bsr TimeDly1 puls a,b,x,y,u,pc TimeDly1 L0F3D pshs x ldx #$2710 TD1loop leax -1,x bne TD1Loop puls x rts * caller passes a pointer to string data in x MenuSelect L0F49 pshs a,y,u ldd #$0000 std X1DB9 jsr X77E5 ldu X1D8B pshs u ldu #$1E25 stu X1D8B stu X1D89 ldy #$0006 sty X1DA7 ldy #$0030 sty X1DA5 ldb ,x+ pshs b pshs b jsr X74CC lbsr L0FC3 lbsr L0FC3 L0F81 jsr X74CC lbsr L0FC3 dec ,s bne L0F81 puls a,b,u stu X1D8B ldu #$1E25 stu X1D89 jsr X7747 addb #$30 pshs b ChkInp lbsr InpReady tsta not ready a = 0 beq ChkInp loop till we get an input tfr a,b move the returned value to b clra cmpb #C$CR beq L0FBA cmpb #C$EOF beq L0FBD cmpb #'1 Looking for input 1 - 7 max depending on menu blt ChkInp less than 1 loop again cmpb ,s bgt ChkInp subb #'1 subtract "one" ($31) from it so we are now zero based bra L0FBF L0FBA clrb bra L0FBF L0FBD ldb #$FF L0FBF leas $01,s puls a,y,u,pc L0FC3 ldy #$0030 sty X1DA5 ldy X1DA7 leay $0C,y sty X1DA7 rts GameSetup N0FD6 pshs a,b,x,y,u lda X4C75 current side sta X4D3C new side value lda X1E16 current year value sta X4D3D new year value ldd #$0000 make room for 4 items pshs d pshs d leax >GameType,pcr lbsr MenuSelect tstb lbmi Ex_GS minus value returned were outa here cmpb #$00 1 was selected (target practice) lbeq CaptName go prompt for capt name stb ,s push value on the stack leax >GameLev,pcr lbsr MenuSelect tstb lbmi Ex_GS minus value returned were outa here stb $03,s push that value on the stack leax >SideChoose,pcr lbsr MenuSelect tstb lbmi Ex_GS minus value returned were outa here stb $01,s push that on the stack lda ,s get the game type from stack cmpa #$02 3 selected War time command ? beq WTCmnd cmpb #$01 check side American ? beq USAin leax >YearChoose,pcr bra YrSel USAin leax >YearChoose2,pcr YrSel lbsr MenuSelect tstb lbmi Ex_GS minus value returned were outa here stb $02,s push on stack bra CaptName WTCmnd L103B clr $02,s clear the year value pshs a push game type cmpb #$01 check side American ? beq Ameri lda #$FF German sta X02A3 side vlaue bra L104F Ameri lda #$23 American sta X02A3 side value L104F puls a CaptName L1051 ldd #$0000 jsr X77E5 jsr X7747 ldd #$0039 std X1DA7 ldd #$0050 std X1DA5 jsr X72F3 this writes the strings? fcc "Enter Captain's Name: " fcb C$NULL fcb $CC fcb C$NULL fcb $45 std X1DA7 ldd #$0056 std X1DA5 jsr X72F3 this writes the strings? fcc "->" fcb C$NULL * copies in the current captains name ldx #$4265 destination address ldy #$0335 source address lda #$19 bytes to read L109B ldb ,y+ get the byte beq L10A4 if we find a zero exit loop stb ,x+ not zero move the data deca decrement the loop counter bne L109B loop till done L10A4 clr ,x clear the byte at x lbsr GetKBinp get keyboard input cmpb #C$EOF lbeq Ex_GS lda X4265 base address of keyboard input cmpa #C$CR a carriage return ? bne HaveNam anything else must be a name leax >Nameless,pcr was a CR no name chosen bra CopyNam HaveNam ldx #$4265 set base address for name string CopyNam lda #$19 max bytes to copy ldy #$0335 captains name storage Cpy2Nam ldb ,x+ get byte cmpb #C$CR is it a carriage return? beq NMDone if so were done stb ,y+ otherwise move the byte deca dec the counter bne Cpy2Nam NMDone clr ,y puls a,b sta X4C76 game type stb X4C75 side puls a year cmpb #$00 test side German ? beq GRyear USyear adda #42 US first year bra SavYear GRyear adda #39 German first year SavYear sta X1E16 save the year value puls a sta X4C77 game level lda #$03 sta X05CE ldd #$0000 std X04F0 std X04F2 std X04F4 std X04F5 std X029A clr X04F7 clr X04F8 clr X04F9 clr X04FA clr X04FB clr X04FC clr X04FD clr X04FE clr X04FF lbsr GetMisDat lbsr GetSubStat lbsr GetShipmap lbsr GetMap lbsr GetConvoy lbsr SetParams lbsr GetControl1 lbsr SetMorePars lda X4C76 test the game type value cmpa #$02 is it war time command ? lbne GetMission no then get your mission ldd #$0000 jsr X77E5 ldu X1D8B pshs u ldu #$1E25 stu X1D8B ldy #$0029 sty X1DA7 ldy #$0010 sty X1DA5 tst X4C75 test side value 0 = German 1 = US bne ImUSA jsr X72F3 this writes the strings? fcc "It is the year 1939, and" fcb C$NULL ldy #$0032 sty X1DA7 ldy #$0010 sty X1DA5 jsr X72F3 this writes the strings? fcc "Germany has started" fcb C$NULL fcb C$CLSALL flag to skip # of bytes after next null fcb C$NULL fcb $4D bytes to skip (US opening message) ImUSA jsr X72F3 this writes the strings? fcc "It is the year 1942, and the" fcb C$NULL ldy #$0032 sty X1DA7 ldy #$0010 sty X1DA5 jsr X72F3 this writes the strings? fcc "United States has entered" fcb C$NULL * ends up here at the null after germay started string ldy #$003A sty X1DA7 ldy #$0010 sty X1DA5 jsr X72F3 this writes the strings? fcc "World War II." fcb C$NULL ldx #$0063 stx X1DA7 ldx #$0048 stx X1DA5 jsr X72F3 this writes the strings? fcc "Press any key" fcb C$NULL puls u stu X1D8B jsr X7747 clra set path to StdIn ldx #$1DDA place to store input ldy #1 get one byte os9 I$Read go fetch it GetMission L124B lbsr Read_Mission puls a,b,x,y,u,pc Ex_GS L1250 leas $04,s clean up the stack puls a,b,x,y,u,pc Return2Sea N1254 pshs a,b,x,y,u ldd #$0000 std X029A clr X04FA clr X04FB clr X04FC clr X04FD clr X04FE clr X04FF lda #$03 sta X05CE ldx X1E17 ldb X1E16 year value pshs b,x lbsr GetMisDat lbsr GetSubStat lbsr GetShipmap lbsr GetMap lbsr GetConvoy lbsr SetParams lbsr GetControl1 lbsr SetMorePars lbsr Zero_txt_area ldx #$0029 stx X1DA7 ldx #$0038 stx X1DA5 ldy X1D8B ldu #$1E25 stu X1D8B ldx X1E17 ldb X1E16 year value cmpb ,s+ beq L12BA leax 365,x L12BA tfr x,d subd ,s++ cmpd #1 bge L12C7 ldd #1 L12C7 jsr X72F3 this writes the strings? fcc "After a leave of " fcb C$NULL jsr X7304 calcs a integer based on input passed in d jsr X72F3 this writes the strings? fcc " days," fcb C$NULL ldx X1DA7 leax 9,x stx X1DA7 ldd #$0038 std X1DA5 jsr X72F3 this writes the strings? fcc "you get a new mission." fcb C$NULL ldx #$0063 stx X1DA7 ldx #$0068 stx X1DA5 jsr X72F3 this writes the strings? fcc "Press any key" fcb C$NULL sty X1D8B lbsr SetandSwap lbsr MVMissn lbsr Read_Mission puls a,b,x,y,u,pc GameType L133D fcb $03 seems to flag number of choices fcc " SELECT GAME TYPE" fcb C$NULL fcc "1. Target practice" fcb C$NULL fcc "2. Single mission" fcb C$NULL fcc "3. Wartime command" fcb C$NULL GameLev L1388 fcb $04 seems to flag number of choices fcc " SELECT GAME LEVEL" fcb C$NULL fcc "1. Novice" fcb C$NULL fcc "2. Intermediate" fcb C$NULL fcc "3. Advanced" fcb C$NULL fcc "4. Expert" fcb C$NULL SideChoose L13CC fcb $02 seems to flag number of choices fcc " CHOOSE A SIDE" fcb C$NULL fcc "1. German" fcb C$NULL fcc "2. American" fcb C$NULL YearChoose L13F3 fcb $07 seems to flag number of choices fcc " CHOOSE A YEAR" fcb C$NULL fcc "1. 1939" fcb C$NULL fcc "2. 1940" fcb C$NULL fcc "3. 1941" fcb C$NULL fcc "4. 1942" fcb C$NULL fcc "5. 1943" fcb C$NULL fcc "6. 1944" fcb C$NULL fcc "7. 1945" fcb C$NULL YearChoose2 L143C fcb $04 seems to flag number of choices fcc " CHOOSE A YEAR" fcb C$NULL fcc "1. 1942" fcb C$NULL fcc "2. 1943" fcb C$NULL fcc "3. 1944" fcb C$NULL fcc "4. 1945" fcb C$NULL TransferTorp N146D pshs a,b,x,y,u leax >TorpTrans,pcr lbsr MenuSelect stb X0291 inc X0297 puls a,b,x,y,u,pc TorpTrans L147E fcb $02 seems to flag number of choices fcc " TRANSFER A TORPEDO" fcb C$NULL fcc "1. Forward to Aft" fcb C$NULL fcc "2. Aft to Forward" fcb C$NULL ByteTblF L14B8 fcb $04,$05,$06,$07,$00,$01 fcb $02,$03 Convoys L14C0 fcc "sub/convoys.dat" fcb C$CR Mis_dat L14D0 fcc "sub/missions.dat" fcb C$CR Mis_txt L14E1 fcc "sub/mission.txt" fcb C$CR SubStat L14F1 fcc "sub/substats.dat" fcb C$CR Font L1502 fcc "sub/fonts.dat" fcb C$CR Shipmap L1510 fcc "sub/shipmap2.dat" fcb C$CR Invert fcc "sub/invert.pic" had no disasm generated label fcb C$CR Control1 L1530 fcc "sub/control1.cmp" fcb C$CR Germap L1541 fcc "sub/germap.cmp" fcb C$CR USAmap L1550 fcc "sub/usamap.cmp" fcb C$CR ByteTbl1 L155F fcb $18,$49,$78,$A8 Tbl1sz equ *-ByteTbl1 ByteTbl2 L1563 fcb $61,$52,$52,$73,$73,$4C fcb $5E,$6A,$2D,$20,$30,$38 fcb $3C,$3E,$3F,$2F,$27,$23 fcb $21,$47,$55,$73,$73,$73 fcb $73,$73,$06,$17,$15,$0B fcb $03,$1D,$09,$1F,$07,$18 fcb $0A,$1B,$04,$05,$08,$19 fcb $12,$0D,$0F,$02,$0E,$1E fcb $0C,$16,$14,$13 ByteTbl3 L1597 fcb $01,$72,$40,$00,$45,$FD fcb $E8,$00,$14,$00,$7E,$00 fcb $00,$37,$40,$00,$FF,$14 fcb $00,$75,$00,$00,$73,$00 fcb $00,$FF,$1E,$00,$75,$00 fcb $00,$73,$00,$00,$FF,$24 fcb $00,$77,$17,$B4,$56,$2F fcb $68,$FF,$24,$00,$77,$F5 fcb $CB,$56,$18,$92,$FF,$28 fcb $00,$5F,$00,$00,$55,$00 fcb $00,$FF,$18,$00,$60,$00 fcb $00,$55,$00,$00,$FF,$1E ByteTbl4 L15DF fcb $00,$00,$00,$1F,$00,$3B fcb $00,$5A,$00,$78,$00,$97 fcb $00,$B5,$00,$D4,$00,$F3 fcb $01,$11,$01,$30,$01,$4E fcb $01,$6D Nameless L15F9 fcc "Nameless" fcb C$CR SinTbl L1602 fcc "sub/sintbl.dat" fcb C$CR emod eom L1614 equ * end