/09/Square/Square.asm
Assembly | 49964 lines | 49964 code | 0 blank | 0 comment | 0 complexity | 33efa8563f02807d3f34ca0062ccadb2 MD5 | raw file
Large files files are truncated, but you can click here to view the full file
- // #0
- @261
- // #1
- D=A
- // #2
- @SP
- // #3
- M=D //SP=261
- // #4
- @Sys.init
- // #5
- 0;JMP
- //
- //// function Array.new 0
- (Array.new)
- //
- //// push argument 0
- //^^ push_from_ram(ARG, 0)
- // #6
- @ARG
- // #7
- D=M
- // #8
- @0
- // #9
- A=D+A
- // #10
- D=M
- //^^ push_d_to_stack
- // #11
- @SP
- // #12
- A=M
- // #13
- M=D
- // #14
- @SP
- // #15
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(ARG, 0)
- //
- //// push constant 0
- //^^ push_constant(0)
- // #16
- @0
- // #17
- D=A
- //^^ push_d_to_stack
- // #18
- @SP
- // #19
- A=M
- // #20
- M=D
- // #21
- @SP
- // #22
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(0)
- //
- //// gt
- //^^ arith_cmp_op(JGT)
- //^^ pop_stack_to_d
- // #23
- @SP
- // #24
- M=M-1
- // #25
- A=M
- // #26
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D-M)
- // #27
- @R13
- // #28
- M=D
- //^^ pop_stack_to_d
- // #29
- @SP
- // #30
- M=M-1
- // #31
- A=M
- // #32
- D=M
- //vv pop_stack_to_d
- // #33
- @R13
- // #34
- D=D-M
- // #35
- @R13
- // #36
- M=0
- //vv arith_d_with_stack_top(D-M)
- // #37
- @PUT_TRUE_1
- // #38
- D;JGT
- // #39
- @R13
- // #40
- M=0
- // #41
- @CONT_1
- // #42
- 0;JMP
- (PUT_TRUE_1)
- // #43
- @R13
- // #44
- M=-1
- (CONT_1)
- // #45
- @R13
- // #46
- D=M
- // #47
- @R13
- // #48
- M=0
- //^^ push_d_to_stack
- // #49
- @SP
- // #50
- A=M
- // #51
- M=D
- // #52
- @SP
- // #53
- M=M+1
- //vv push_d_to_stack
- //vv arith_cmp_op(JGT)
- //
- //// not
- //^^ arith_unary_op(!)
- //^^ pop_stack_to_d
- // #54
- @SP
- // #55
- M=M-1
- // #56
- A=M
- // #57
- D=M
- //vv pop_stack_to_d
- // #58
- D=!D
- //^^ push_d_to_stack
- // #59
- @SP
- // #60
- A=M
- // #61
- M=D
- // #62
- @SP
- // #63
- M=M+1
- //vv push_d_to_stack
- //vv arith_unary_op(!)
- //
- //// if-goto IF_TRUE0
- //^^ pop_stack_to_d
- // #64
- @SP
- // #65
- M=M-1
- // #66
- A=M
- // #67
- D=M
- //vv pop_stack_to_d
- // #68
- @Array.new$IF_TRUE0
- // #69
- D;JNE
- //
- //// goto IF_FALSE0
- // #70
- @Array.new$IF_FALSE0
- // #71
- 0;JMP
- //
- //// label IF_TRUE0
- (Array.new$IF_TRUE0)
- //
- //// push constant 2
- //^^ push_constant(2)
- // #72
- @2
- // #73
- D=A
- //^^ push_d_to_stack
- // #74
- @SP
- // #75
- A=M
- // #76
- M=D
- // #77
- @SP
- // #78
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(2)
- //
- //// call Sys.error 1
- //^^ push_constant(RET_ADDR_2)
- // #79
- @RET_ADDR_2
- // #80
- D=A
- //^^ push_d_to_stack
- // #81
- @SP
- // #82
- A=M
- // #83
- M=D
- // #84
- @SP
- // #85
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(RET_ADDR_2)
- //push return-address
- // #86
- @LCL
- // #87
- D=M
- //^^ push_d_to_stack
- // #88
- @SP
- // #89
- A=M
- // #90
- M=D
- // #91
- @SP
- // #92
- M=M+1
- //vv push_d_to_stack
- //push LCL
- // #93
- @ARG
- // #94
- D=M
- //^^ push_d_to_stack
- // #95
- @SP
- // #96
- A=M
- // #97
- M=D
- // #98
- @SP
- // #99
- M=M+1
- //vv push_d_to_stack
- //push ARG
- // #100
- @THIS
- // #101
- D=M
- //^^ push_d_to_stack
- // #102
- @SP
- // #103
- A=M
- // #104
- M=D
- // #105
- @SP
- // #106
- M=M+1
- //vv push_d_to_stack
- //push THIS
- // #107
- @THAT
- // #108
- D=M
- //^^ push_d_to_stack
- // #109
- @SP
- // #110
- A=M
- // #111
- M=D
- // #112
- @SP
- // #113
- M=M+1
- //vv push_d_to_stack
- //push THAT
- // #114
- @SP
- // #115
- D=M
- // #116
- @ARG
- // #117
- M=D
- // #118
- @6
- // #119
- D=A
- // #120
- @ARG
- // #121
- M=M-D // ARG = SP - args - 5
- // #122
- @SP
- // #123
- D=M
- // #124
- @LCL
- // #125
- M=D // LCL = SP
- // #126
- @Sys.error
- // #127
- 0;JMP
- (RET_ADDR_2)
- //
- //// pop temp 0
- //^^ pop_to_loc{5)
- //^^ pop_stack_to_d
- // #128
- @SP
- // #129
- M=M-1
- // #130
- A=M
- // #131
- D=M
- //vv pop_stack_to_d
- // #132
- @5
- // #133
- M=D
- //vv pop_to_loc{5)
- //
- //// label IF_FALSE0
- (Array.new$IF_FALSE0)
- //
- //// push argument 0
- //^^ push_from_ram(ARG, 0)
- // #134
- @ARG
- // #135
- D=M
- // #136
- @0
- // #137
- A=D+A
- // #138
- D=M
- //^^ push_d_to_stack
- // #139
- @SP
- // #140
- A=M
- // #141
- M=D
- // #142
- @SP
- // #143
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(ARG, 0)
- //
- //// call Memory.alloc 1
- //^^ push_constant(RET_ADDR_3)
- // #144
- @RET_ADDR_3
- // #145
- D=A
- //^^ push_d_to_stack
- // #146
- @SP
- // #147
- A=M
- // #148
- M=D
- // #149
- @SP
- // #150
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(RET_ADDR_3)
- //push return-address
- // #151
- @LCL
- // #152
- D=M
- //^^ push_d_to_stack
- // #153
- @SP
- // #154
- A=M
- // #155
- M=D
- // #156
- @SP
- // #157
- M=M+1
- //vv push_d_to_stack
- //push LCL
- // #158
- @ARG
- // #159
- D=M
- //^^ push_d_to_stack
- // #160
- @SP
- // #161
- A=M
- // #162
- M=D
- // #163
- @SP
- // #164
- M=M+1
- //vv push_d_to_stack
- //push ARG
- // #165
- @THIS
- // #166
- D=M
- //^^ push_d_to_stack
- // #167
- @SP
- // #168
- A=M
- // #169
- M=D
- // #170
- @SP
- // #171
- M=M+1
- //vv push_d_to_stack
- //push THIS
- // #172
- @THAT
- // #173
- D=M
- //^^ push_d_to_stack
- // #174
- @SP
- // #175
- A=M
- // #176
- M=D
- // #177
- @SP
- // #178
- M=M+1
- //vv push_d_to_stack
- //push THAT
- // #179
- @SP
- // #180
- D=M
- // #181
- @ARG
- // #182
- M=D
- // #183
- @6
- // #184
- D=A
- // #185
- @ARG
- // #186
- M=M-D // ARG = SP - args - 5
- // #187
- @SP
- // #188
- D=M
- // #189
- @LCL
- // #190
- M=D // LCL = SP
- // #191
- @Memory.alloc
- // #192
- 0;JMP
- (RET_ADDR_3)
- //
- //// return
- // #193
- @LCL
- // #194
- D=M
- // #195
- @R14
- // #196
- M=D //R14=LCL
- // #197
- @5
- // #198
- A=D-A
- // #199
- D=M
- // #200
- @R15
- // #201
- M=D //R15=*(LCL-5)
- //^^ pop_stack_to_d
- // #202
- @SP
- // #203
- M=M-1
- // #204
- A=M
- // #205
- D=M
- //vv pop_stack_to_d
- // #206
- @ARG
- // #207
- A=M
- // #208
- M=D //*ARG = pop()
- // #209
- @ARG
- // #210
- D=M
- // #211
- @SP
- // #212
- M=D+1 //SP=ARG+1
- // #213
- @R14
- // #214
- AM=M-1
- // #215
- D=M
- // #216
- @THAT
- // #217
- M=D //THAT = *(--R14)
- // #218
- @R14
- // #219
- AM=M-1
- // #220
- D=M
- // #221
- @THIS
- // #222
- M=D //THIS = *(--R14)
- // #223
- @R14
- // #224
- AM=M-1
- // #225
- D=M
- // #226
- @ARG
- // #227
- M=D //ARG = *(--R14)
- // #228
- @R14
- // #229
- AM=M-1
- // #230
- D=M
- // #231
- @LCL
- // #232
- M=D //LCL = *(--R14)
- // #233
- @R15
- // #234
- A=M
- // #235
- 0;JMP //goto *R15
- //
- //// function Array.dispose 0
- (Array.dispose)
- //
- //// push argument 0
- //^^ push_from_ram(ARG, 0)
- // #236
- @ARG
- // #237
- D=M
- // #238
- @0
- // #239
- A=D+A
- // #240
- D=M
- //^^ push_d_to_stack
- // #241
- @SP
- // #242
- A=M
- // #243
- M=D
- // #244
- @SP
- // #245
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(ARG, 0)
- //
- //// pop pointer 0
- //^^ pop_to_loc{3)
- //^^ pop_stack_to_d
- // #246
- @SP
- // #247
- M=M-1
- // #248
- A=M
- // #249
- D=M
- //vv pop_stack_to_d
- // #250
- @3
- // #251
- M=D
- //vv pop_to_loc{3)
- //
- //// push pointer 0
- //^^ push_from_loc(3)
- // #252
- @3
- // #253
- D=M
- //^^ push_d_to_stack
- // #254
- @SP
- // #255
- A=M
- // #256
- M=D
- // #257
- @SP
- // #258
- M=M+1
- //vv push_d_to_stack
- //vv push_from_loc(3)
- //
- //// call Memory.deAlloc 1
- //^^ push_constant(RET_ADDR_4)
- // #259
- @RET_ADDR_4
- // #260
- D=A
- //^^ push_d_to_stack
- // #261
- @SP
- // #262
- A=M
- // #263
- M=D
- // #264
- @SP
- // #265
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(RET_ADDR_4)
- //push return-address
- // #266
- @LCL
- // #267
- D=M
- //^^ push_d_to_stack
- // #268
- @SP
- // #269
- A=M
- // #270
- M=D
- // #271
- @SP
- // #272
- M=M+1
- //vv push_d_to_stack
- //push LCL
- // #273
- @ARG
- // #274
- D=M
- //^^ push_d_to_stack
- // #275
- @SP
- // #276
- A=M
- // #277
- M=D
- // #278
- @SP
- // #279
- M=M+1
- //vv push_d_to_stack
- //push ARG
- // #280
- @THIS
- // #281
- D=M
- //^^ push_d_to_stack
- // #282
- @SP
- // #283
- A=M
- // #284
- M=D
- // #285
- @SP
- // #286
- M=M+1
- //vv push_d_to_stack
- //push THIS
- // #287
- @THAT
- // #288
- D=M
- //^^ push_d_to_stack
- // #289
- @SP
- // #290
- A=M
- // #291
- M=D
- // #292
- @SP
- // #293
- M=M+1
- //vv push_d_to_stack
- //push THAT
- // #294
- @SP
- // #295
- D=M
- // #296
- @ARG
- // #297
- M=D
- // #298
- @6
- // #299
- D=A
- // #300
- @ARG
- // #301
- M=M-D // ARG = SP - args - 5
- // #302
- @SP
- // #303
- D=M
- // #304
- @LCL
- // #305
- M=D // LCL = SP
- // #306
- @Memory.deAlloc
- // #307
- 0;JMP
- (RET_ADDR_4)
- //
- //// pop temp 0
- //^^ pop_to_loc{5)
- //^^ pop_stack_to_d
- // #308
- @SP
- // #309
- M=M-1
- // #310
- A=M
- // #311
- D=M
- //vv pop_stack_to_d
- // #312
- @5
- // #313
- M=D
- //vv pop_to_loc{5)
- //
- //// push constant 0
- //^^ push_constant(0)
- // #314
- @0
- // #315
- D=A
- //^^ push_d_to_stack
- // #316
- @SP
- // #317
- A=M
- // #318
- M=D
- // #319
- @SP
- // #320
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(0)
- //
- //// return
- // #321
- @LCL
- // #322
- D=M
- // #323
- @R14
- // #324
- M=D //R14=LCL
- // #325
- @5
- // #326
- A=D-A
- // #327
- D=M
- // #328
- @R15
- // #329
- M=D //R15=*(LCL-5)
- //^^ pop_stack_to_d
- // #330
- @SP
- // #331
- M=M-1
- // #332
- A=M
- // #333
- D=M
- //vv pop_stack_to_d
- // #334
- @ARG
- // #335
- A=M
- // #336
- M=D //*ARG = pop()
- // #337
- @ARG
- // #338
- D=M
- // #339
- @SP
- // #340
- M=D+1 //SP=ARG+1
- // #341
- @R14
- // #342
- AM=M-1
- // #343
- D=M
- // #344
- @THAT
- // #345
- M=D //THAT = *(--R14)
- // #346
- @R14
- // #347
- AM=M-1
- // #348
- D=M
- // #349
- @THIS
- // #350
- M=D //THIS = *(--R14)
- // #351
- @R14
- // #352
- AM=M-1
- // #353
- D=M
- // #354
- @ARG
- // #355
- M=D //ARG = *(--R14)
- // #356
- @R14
- // #357
- AM=M-1
- // #358
- D=M
- // #359
- @LCL
- // #360
- M=D //LCL = *(--R14)
- // #361
- @R15
- // #362
- A=M
- // #363
- 0;JMP //goto *R15
- //
- //// function Keyboard.init 0
- (Keyboard.init)
- //
- //// push constant 0
- //^^ push_constant(0)
- // #364
- @0
- // #365
- D=A
- //^^ push_d_to_stack
- // #366
- @SP
- // #367
- A=M
- // #368
- M=D
- // #369
- @SP
- // #370
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(0)
- //
- //// return
- // #371
- @LCL
- // #372
- D=M
- // #373
- @R14
- // #374
- M=D //R14=LCL
- // #375
- @5
- // #376
- A=D-A
- // #377
- D=M
- // #378
- @R15
- // #379
- M=D //R15=*(LCL-5)
- //^^ pop_stack_to_d
- // #380
- @SP
- // #381
- M=M-1
- // #382
- A=M
- // #383
- D=M
- //vv pop_stack_to_d
- // #384
- @ARG
- // #385
- A=M
- // #386
- M=D //*ARG = pop()
- // #387
- @ARG
- // #388
- D=M
- // #389
- @SP
- // #390
- M=D+1 //SP=ARG+1
- // #391
- @R14
- // #392
- AM=M-1
- // #393
- D=M
- // #394
- @THAT
- // #395
- M=D //THAT = *(--R14)
- // #396
- @R14
- // #397
- AM=M-1
- // #398
- D=M
- // #399
- @THIS
- // #400
- M=D //THIS = *(--R14)
- // #401
- @R14
- // #402
- AM=M-1
- // #403
- D=M
- // #404
- @ARG
- // #405
- M=D //ARG = *(--R14)
- // #406
- @R14
- // #407
- AM=M-1
- // #408
- D=M
- // #409
- @LCL
- // #410
- M=D //LCL = *(--R14)
- // #411
- @R15
- // #412
- A=M
- // #413
- 0;JMP //goto *R15
- //
- //// function Keyboard.keyPressed 0
- (Keyboard.keyPressed)
- //
- //// push constant 24576
- //^^ push_constant(24576)
- // #414
- @24576
- // #415
- D=A
- //^^ push_d_to_stack
- // #416
- @SP
- // #417
- A=M
- // #418
- M=D
- // #419
- @SP
- // #420
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(24576)
- //
- //// call Memory.peek 1
- //^^ push_constant(RET_ADDR_5)
- // #421
- @RET_ADDR_5
- // #422
- D=A
- //^^ push_d_to_stack
- // #423
- @SP
- // #424
- A=M
- // #425
- M=D
- // #426
- @SP
- // #427
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(RET_ADDR_5)
- //push return-address
- // #428
- @LCL
- // #429
- D=M
- //^^ push_d_to_stack
- // #430
- @SP
- // #431
- A=M
- // #432
- M=D
- // #433
- @SP
- // #434
- M=M+1
- //vv push_d_to_stack
- //push LCL
- // #435
- @ARG
- // #436
- D=M
- //^^ push_d_to_stack
- // #437
- @SP
- // #438
- A=M
- // #439
- M=D
- // #440
- @SP
- // #441
- M=M+1
- //vv push_d_to_stack
- //push ARG
- // #442
- @THIS
- // #443
- D=M
- //^^ push_d_to_stack
- // #444
- @SP
- // #445
- A=M
- // #446
- M=D
- // #447
- @SP
- // #448
- M=M+1
- //vv push_d_to_stack
- //push THIS
- // #449
- @THAT
- // #450
- D=M
- //^^ push_d_to_stack
- // #451
- @SP
- // #452
- A=M
- // #453
- M=D
- // #454
- @SP
- // #455
- M=M+1
- //vv push_d_to_stack
- //push THAT
- // #456
- @SP
- // #457
- D=M
- // #458
- @ARG
- // #459
- M=D
- // #460
- @6
- // #461
- D=A
- // #462
- @ARG
- // #463
- M=M-D // ARG = SP - args - 5
- // #464
- @SP
- // #465
- D=M
- // #466
- @LCL
- // #467
- M=D // LCL = SP
- // #468
- @Memory.peek
- // #469
- 0;JMP
- (RET_ADDR_5)
- //
- //// return
- // #470
- @LCL
- // #471
- D=M
- // #472
- @R14
- // #473
- M=D //R14=LCL
- // #474
- @5
- // #475
- A=D-A
- // #476
- D=M
- // #477
- @R15
- // #478
- M=D //R15=*(LCL-5)
- //^^ pop_stack_to_d
- // #479
- @SP
- // #480
- M=M-1
- // #481
- A=M
- // #482
- D=M
- //vv pop_stack_to_d
- // #483
- @ARG
- // #484
- A=M
- // #485
- M=D //*ARG = pop()
- // #486
- @ARG
- // #487
- D=M
- // #488
- @SP
- // #489
- M=D+1 //SP=ARG+1
- // #490
- @R14
- // #491
- AM=M-1
- // #492
- D=M
- // #493
- @THAT
- // #494
- M=D //THAT = *(--R14)
- // #495
- @R14
- // #496
- AM=M-1
- // #497
- D=M
- // #498
- @THIS
- // #499
- M=D //THIS = *(--R14)
- // #500
- @R14
- // #501
- AM=M-1
- // #502
- D=M
- // #503
- @ARG
- // #504
- M=D //ARG = *(--R14)
- // #505
- @R14
- // #506
- AM=M-1
- // #507
- D=M
- // #508
- @LCL
- // #509
- M=D //LCL = *(--R14)
- // #510
- @R15
- // #511
- A=M
- // #512
- 0;JMP //goto *R15
- //
- //// function Keyboard.readChar 2
- (Keyboard.readChar)
- // #513
- D=0
- //^^ push_d_to_stack
- // #514
- @SP
- // #515
- A=M
- // #516
- M=D
- // #517
- @SP
- // #518
- M=M+1
- //vv push_d_to_stack
- // #519
- D=0
- //^^ push_d_to_stack
- // #520
- @SP
- // #521
- A=M
- // #522
- M=D
- // #523
- @SP
- // #524
- M=M+1
- //vv push_d_to_stack
- //
- //// call SquareGame.new 0
- //^^ push_constant(RET_ADDR_26)
- // #525
- @RET_ADDR_26
- // #526
- D=A
- //^^ push_d_to_stack
- // #527
- @SP
- // #528
- A=M
- // #529
- M=D
- // #530
- @SP
- // #531
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(RET_ADDR_26)
- //push return-address
- // #532
- @LCL
- // #533
- D=M
- //^^ push_d_to_stack
- // #534
- @SP
- // #535
- A=M
- // #536
- M=D
- // #537
- @SP
- // #538
- M=M+1
- //vv push_d_to_stack
- //push LCL
- // #539
- @ARG
- // #540
- D=M
- //^^ push_d_to_stack
- // #541
- @SP
- // #542
- A=M
- // #543
- M=D
- // #544
- @SP
- // #545
- M=M+1
- //vv push_d_to_stack
- //push ARG
- // #546
- @THIS
- // #547
- D=M
- //^^ push_d_to_stack
- // #548
- @SP
- // #549
- A=M
- // #550
- M=D
- // #551
- @SP
- // #552
- M=M+1
- //vv push_d_to_stack
- //push THIS
- // #553
- @THAT
- // #554
- D=M
- //^^ push_d_to_stack
- // #555
- @SP
- // #556
- A=M
- // #557
- M=D
- // #558
- @SP
- // #559
- M=M+1
- //vv push_d_to_stack
- //push THAT
- // #560
- @SP
- // #561
- D=M
- // #562
- @ARG
- // #563
- M=D
- // #564
- @5
- // #565
- D=A
- // #566
- @ARG
- // #567
- M=M-D // ARG = SP - args - 5
- // #568
- @SP
- // #569
- D=M
- // #570
- @LCL
- // #571
- M=D // LCL = SP
- // #572
- @SquareGame.new
- // #573
- 0;JMP
- (RET_ADDR_26)
- //
- //// pop local 0
- //^^ pop_to_ram(LCL, 0)
- // #574
- @LCL
- // #575
- D=M
- // #576
- @0
- // #577
- D=D+A
- // #578
- @R13
- // #579
- M=D
- //^^ pop_stack_to_d
- // #580
- @SP
- // #581
- M=M-1
- // #582
- A=M
- // #583
- D=M
- //vv pop_stack_to_d
- // #584
- @R13
- // #585
- A=M
- // #586
- M=D
- // #587
- @R13
- // #588
- M=0
- //vv pop_to_ram(LCL, 0)
- //
- //// push local 0
- //^^ push_from_ram(LCL, 0)
- // #589
- @LCL
- // #590
- D=M
- // #591
- @0
- // #592
- A=D+A
- // #593
- D=M
- //^^ push_d_to_stack
- // #594
- @SP
- // #595
- A=M
- // #596
- M=D
- // #597
- @SP
- // #598
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(LCL, 0)
- //
- //// call SquareGame.run 1
- //^^ push_constant(RET_ADDR_27)
- // #599
- @RET_ADDR_27
- // #600
- D=A
- //^^ push_d_to_stack
- // #601
- @SP
- // #602
- A=M
- // #603
- M=D
- // #604
- @SP
- // #605
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(RET_ADDR_27)
- //push return-address
- // #606
- @LCL
- // #607
- D=M
- //^^ push_d_to_stack
- // #608
- @SP
- // #609
- A=M
- // #610
- M=D
- // #611
- @SP
- // #612
- M=M+1
- //vv push_d_to_stack
- //push LCL
- // #613
- @ARG
- // #614
- D=M
- //^^ push_d_to_stack
- // #615
- @SP
- // #616
- A=M
- // #617
- M=D
- // #618
- @SP
- // #619
- M=M+1
- //vv push_d_to_stack
- //push ARG
- // #620
- @THIS
- // #621
- D=M
- //^^ push_d_to_stack
- // #622
- @SP
- // #623
- A=M
- // #624
- M=D
- // #625
- @SP
- // #626
- M=M+1
- //vv push_d_to_stack
- //push THIS
- // #627
- @THAT
- // #628
- D=M
- //^^ push_d_to_stack
- // #629
- @SP
- // #630
- A=M
- // #631
- M=D
- // #632
- @SP
- // #633
- M=M+1
- //vv push_d_to_stack
- //push THAT
- // #634
- @SP
- // #635
- D=M
- // #636
- @ARG
- // #637
- M=D
- // #638
- @6
- // #639
- D=A
- // #640
- @ARG
- // #641
- M=M-D // ARG = SP - args - 5
- // #642
- @SP
- // #643
- D=M
- // #644
- @LCL
- // #645
- M=D // LCL = SP
- // #646
- @SquareGame.run
- // #647
- 0;JMP
- (RET_ADDR_27)
- //
- //// pop temp 0
- //^^ pop_to_loc{5)
- //^^ pop_stack_to_d
- // #648
- @SP
- // #649
- M=M-1
- // #650
- A=M
- // #651
- D=M
- //vv pop_stack_to_d
- // #652
- @5
- // #653
- M=D
- //vv pop_to_loc{5)
- //
- //// push local 0
- //^^ push_from_ram(LCL, 0)
- // #654
- @LCL
- // #655
- D=M
- // #656
- @0
- // #657
- A=D+A
- // #658
- D=M
- //^^ push_d_to_stack
- // #659
- @SP
- // #660
- A=M
- // #661
- M=D
- // #662
- @SP
- // #663
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(LCL, 0)
- //
- //// call SquareGame.dispose 1
- //^^ push_constant(RET_ADDR_28)
- // #664
- @RET_ADDR_28
- // #665
- D=A
- //^^ push_d_to_stack
- // #666
- @SP
- // #667
- A=M
- // #668
- M=D
- // #669
- @SP
- // #670
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(RET_ADDR_28)
- //push return-address
- // #671
- @LCL
- // #672
- D=M
- //^^ push_d_to_stack
- // #673
- @SP
- // #674
- A=M
- // #675
- M=D
- // #676
- @SP
- // #677
- M=M+1
- //vv push_d_to_stack
- //push LCL
- // #678
- @ARG
- // #679
- D=M
- //^^ push_d_to_stack
- // #680
- @SP
- // #681
- A=M
- // #682
- M=D
- // #683
- @SP
- // #684
- M=M+1
- //vv push_d_to_stack
- //push ARG
- // #685
- @THIS
- // #686
- D=M
- //^^ push_d_to_stack
- // #687
- @SP
- // #688
- A=M
- // #689
- M=D
- // #690
- @SP
- // #691
- M=M+1
- //vv push_d_to_stack
- //push THIS
- // #692
- @THAT
- // #693
- D=M
- //^^ push_d_to_stack
- // #694
- @SP
- // #695
- A=M
- // #696
- M=D
- // #697
- @SP
- // #698
- M=M+1
- //vv push_d_to_stack
- //push THAT
- // #699
- @SP
- // #700
- D=M
- // #701
- @ARG
- // #702
- M=D
- // #703
- @6
- // #704
- D=A
- // #705
- @ARG
- // #706
- M=M-D // ARG = SP - args - 5
- // #707
- @SP
- // #708
- D=M
- // #709
- @LCL
- // #710
- M=D // LCL = SP
- // #711
- @SquareGame.dispose
- // #712
- 0;JMP
- (RET_ADDR_28)
- //
- //// pop temp 0
- //^^ pop_to_loc{5)
- //^^ pop_stack_to_d
- // #713
- @SP
- // #714
- M=M-1
- // #715
- A=M
- // #716
- D=M
- //vv pop_stack_to_d
- // #717
- @5
- // #718
- M=D
- //vv pop_to_loc{5)
- //
- //// push constant 0
- //^^ push_constant(0)
- // #719
- @0
- // #720
- D=A
- //^^ push_d_to_stack
- // #721
- @SP
- // #722
- A=M
- // #723
- M=D
- // #724
- @SP
- // #725
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(0)
- //
- //// return
- // #726
- @LCL
- // #727
- D=M
- // #728
- @R14
- // #729
- M=D //R14=LCL
- // #730
- @5
- // #731
- A=D-A
- // #732
- D=M
- // #733
- @R15
- // #734
- M=D //R15=*(LCL-5)
- //^^ pop_stack_to_d
- // #735
- @SP
- // #736
- M=M-1
- // #737
- A=M
- // #738
- D=M
- //vv pop_stack_to_d
- // #739
- @ARG
- // #740
- A=M
- // #741
- M=D //*ARG = pop()
- // #742
- @ARG
- // #743
- D=M
- // #744
- @SP
- // #745
- M=D+1 //SP=ARG+1
- // #746
- @R14
- // #747
- AM=M-1
- // #748
- D=M
- // #749
- @THAT
- // #750
- M=D //THAT = *(--R14)
- // #751
- @R14
- // #752
- AM=M-1
- // #753
- D=M
- // #754
- @THIS
- // #755
- M=D //THIS = *(--R14)
- // #756
- @R14
- // #757
- AM=M-1
- // #758
- D=M
- // #759
- @ARG
- // #760
- M=D //ARG = *(--R14)
- // #761
- @R14
- // #762
- AM=M-1
- // #763
- D=M
- // #764
- @LCL
- // #765
- M=D //LCL = *(--R14)
- // #766
- @R15
- // #767
- A=M
- // #768
- 0;JMP //goto *R15
- //
- //// function Math.init 1
- (Math.init)
- // #769
- D=0
- //^^ push_d_to_stack
- // #770
- @SP
- // #771
- A=M
- // #772
- M=D
- // #773
- @SP
- // #774
- M=M+1
- //vv push_d_to_stack
- //
- //// push constant 16
- //^^ push_constant(16)
- // #775
- @16
- // #776
- D=A
- //^^ push_d_to_stack
- // #777
- @SP
- // #778
- A=M
- // #779
- M=D
- // #780
- @SP
- // #781
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(16)
- //
- //// call Array.new 1
- //^^ push_constant(RET_ADDR_29)
- // #782
- @RET_ADDR_29
- // #783
- D=A
- //^^ push_d_to_stack
- // #784
- @SP
- // #785
- A=M
- // #786
- M=D
- // #787
- @SP
- // #788
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(RET_ADDR_29)
- //push return-address
- // #789
- @LCL
- // #790
- D=M
- //^^ push_d_to_stack
- // #791
- @SP
- // #792
- A=M
- // #793
- M=D
- // #794
- @SP
- // #795
- M=M+1
- //vv push_d_to_stack
- //push LCL
- // #796
- @ARG
- // #797
- D=M
- //^^ push_d_to_stack
- // #798
- @SP
- // #799
- A=M
- // #800
- M=D
- // #801
- @SP
- // #802
- M=M+1
- //vv push_d_to_stack
- //push ARG
- // #803
- @THIS
- // #804
- D=M
- //^^ push_d_to_stack
- // #805
- @SP
- // #806
- A=M
- // #807
- M=D
- // #808
- @SP
- // #809
- M=M+1
- //vv push_d_to_stack
- //push THIS
- // #810
- @THAT
- // #811
- D=M
- //^^ push_d_to_stack
- // #812
- @SP
- // #813
- A=M
- // #814
- M=D
- // #815
- @SP
- // #816
- M=M+1
- //vv push_d_to_stack
- //push THAT
- // #817
- @SP
- // #818
- D=M
- // #819
- @ARG
- // #820
- M=D
- // #821
- @6
- // #822
- D=A
- // #823
- @ARG
- // #824
- M=M-D // ARG = SP - args - 5
- // #825
- @SP
- // #826
- D=M
- // #827
- @LCL
- // #828
- M=D // LCL = SP
- // #829
- @Array.new
- // #830
- 0;JMP
- (RET_ADDR_29)
- //
- //// pop static 1
- //^^ pop_to_loc{Math.vm.1)
- //^^ pop_stack_to_d
- // #831
- @SP
- // #832
- M=M-1
- // #833
- A=M
- // #834
- D=M
- //vv pop_stack_to_d
- // #835
- @Math.vm.1
- // #836
- M=D
- //vv pop_to_loc{Math.vm.1)
- //
- //// push constant 16
- //^^ push_constant(16)
- // #837
- @16
- // #838
- D=A
- //^^ push_d_to_stack
- // #839
- @SP
- // #840
- A=M
- // #841
- M=D
- // #842
- @SP
- // #843
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(16)
- //
- //// call Array.new 1
- //^^ push_constant(RET_ADDR_30)
- // #844
- @RET_ADDR_30
- // #845
- D=A
- //^^ push_d_to_stack
- // #846
- @SP
- // #847
- A=M
- // #848
- M=D
- // #849
- @SP
- // #850
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(RET_ADDR_30)
- //push return-address
- // #851
- @LCL
- // #852
- D=M
- //^^ push_d_to_stack
- // #853
- @SP
- // #854
- A=M
- // #855
- M=D
- // #856
- @SP
- // #857
- M=M+1
- //vv push_d_to_stack
- //push LCL
- // #858
- @ARG
- // #859
- D=M
- //^^ push_d_to_stack
- // #860
- @SP
- // #861
- A=M
- // #862
- M=D
- // #863
- @SP
- // #864
- M=M+1
- //vv push_d_to_stack
- //push ARG
- // #865
- @THIS
- // #866
- D=M
- //^^ push_d_to_stack
- // #867
- @SP
- // #868
- A=M
- // #869
- M=D
- // #870
- @SP
- // #871
- M=M+1
- //vv push_d_to_stack
- //push THIS
- // #872
- @THAT
- // #873
- D=M
- //^^ push_d_to_stack
- // #874
- @SP
- // #875
- A=M
- // #876
- M=D
- // #877
- @SP
- // #878
- M=M+1
- //vv push_d_to_stack
- //push THAT
- // #879
- @SP
- // #880
- D=M
- // #881
- @ARG
- // #882
- M=D
- // #883
- @6
- // #884
- D=A
- // #885
- @ARG
- // #886
- M=M-D // ARG = SP - args - 5
- // #887
- @SP
- // #888
- D=M
- // #889
- @LCL
- // #890
- M=D // LCL = SP
- // #891
- @Array.new
- // #892
- 0;JMP
- (RET_ADDR_30)
- //
- //// pop static 0
- //^^ pop_to_loc{Math.vm.0)
- //^^ pop_stack_to_d
- // #893
- @SP
- // #894
- M=M-1
- // #895
- A=M
- // #896
- D=M
- //vv pop_stack_to_d
- // #897
- @Math.vm.0
- // #898
- M=D
- //vv pop_to_loc{Math.vm.0)
- //
- //// push constant 0
- //^^ push_constant(0)
- // #899
- @0
- // #900
- D=A
- //^^ push_d_to_stack
- // #901
- @SP
- // #902
- A=M
- // #903
- M=D
- // #904
- @SP
- // #905
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(0)
- //
- //// push static 0
- //^^ push_from_loc(Math.vm.0)
- // #906
- @Math.vm.0
- // #907
- D=M
- //^^ push_d_to_stack
- // #908
- @SP
- // #909
- A=M
- // #910
- M=D
- // #911
- @SP
- // #912
- M=M+1
- //vv push_d_to_stack
- //vv push_from_loc(Math.vm.0)
- //
- //// add
- //^^ arith_binary_op(+)
- //^^ pop_stack_to_d
- // #913
- @SP
- // #914
- M=M-1
- // #915
- A=M
- // #916
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D+M)
- // #917
- @R13
- // #918
- M=D
- //^^ pop_stack_to_d
- // #919
- @SP
- // #920
- M=M-1
- // #921
- A=M
- // #922
- D=M
- //vv pop_stack_to_d
- // #923
- @R13
- // #924
- D=D+M
- // #925
- @R13
- // #926
- M=0
- //vv arith_d_with_stack_top(D+M)
- //^^ push_d_to_stack
- // #927
- @SP
- // #928
- A=M
- // #929
- M=D
- // #930
- @SP
- // #931
- M=M+1
- //vv push_d_to_stack
- //vv arith_binary_op(+)
- //
- //// push constant 1
- //^^ push_constant(1)
- // #932
- @1
- // #933
- D=A
- //^^ push_d_to_stack
- // #934
- @SP
- // #935
- A=M
- // #936
- M=D
- // #937
- @SP
- // #938
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(1)
- //
- //// pop temp 0
- //^^ pop_to_loc{5)
- //^^ pop_stack_to_d
- // #939
- @SP
- // #940
- M=M-1
- // #941
- A=M
- // #942
- D=M
- //vv pop_stack_to_d
- // #943
- @5
- // #944
- M=D
- //vv pop_to_loc{5)
- //
- //// pop pointer 1
- //^^ pop_to_loc{4)
- //^^ pop_stack_to_d
- // #945
- @SP
- // #946
- M=M-1
- // #947
- A=M
- // #948
- D=M
- //vv pop_stack_to_d
- // #949
- @4
- // #950
- M=D
- //vv pop_to_loc{4)
- //
- //// push temp 0
- //^^ push_from_loc(5)
- // #951
- @5
- // #952
- D=M
- //^^ push_d_to_stack
- // #953
- @SP
- // #954
- A=M
- // #955
- M=D
- // #956
- @SP
- // #957
- M=M+1
- //vv push_d_to_stack
- //vv push_from_loc(5)
- //
- //// pop that 0
- //^^ pop_to_ram(THAT, 0)
- // #958
- @THAT
- // #959
- D=M
- // #960
- @0
- // #961
- D=D+A
- // #962
- @R13
- // #963
- M=D
- //^^ pop_stack_to_d
- // #964
- @SP
- // #965
- M=M-1
- // #966
- A=M
- // #967
- D=M
- //vv pop_stack_to_d
- // #968
- @R13
- // #969
- A=M
- // #970
- M=D
- // #971
- @R13
- // #972
- M=0
- //vv pop_to_ram(THAT, 0)
- //
- //// label WHILE_EXP0
- (Math.init$WHILE_EXP0)
- //
- //// push local 0
- //^^ push_from_ram(LCL, 0)
- // #973
- @LCL
- // #974
- D=M
- // #975
- @0
- // #976
- A=D+A
- // #977
- D=M
- //^^ push_d_to_stack
- // #978
- @SP
- // #979
- A=M
- // #980
- M=D
- // #981
- @SP
- // #982
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(LCL, 0)
- //
- //// push constant 15
- //^^ push_constant(15)
- // #983
- @15
- // #984
- D=A
- //^^ push_d_to_stack
- // #985
- @SP
- // #986
- A=M
- // #987
- M=D
- // #988
- @SP
- // #989
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(15)
- //
- //// lt
- //^^ arith_cmp_op(JLT)
- //^^ pop_stack_to_d
- // #990
- @SP
- // #991
- M=M-1
- // #992
- A=M
- // #993
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D-M)
- // #994
- @R13
- // #995
- M=D
- //^^ pop_stack_to_d
- // #996
- @SP
- // #997
- M=M-1
- // #998
- A=M
- // #999
- D=M
- //vv pop_stack_to_d
- // #1000
- @R13
- // #1001
- D=D-M
- // #1002
- @R13
- // #1003
- M=0
- //vv arith_d_with_stack_top(D-M)
- // #1004
- @PUT_TRUE_31
- // #1005
- D;JLT
- // #1006
- @R13
- // #1007
- M=0
- // #1008
- @CONT_31
- // #1009
- 0;JMP
- (PUT_TRUE_31)
- // #1010
- @R13
- // #1011
- M=-1
- (CONT_31)
- // #1012
- @R13
- // #1013
- D=M
- // #1014
- @R13
- // #1015
- M=0
- //^^ push_d_to_stack
- // #1016
- @SP
- // #1017
- A=M
- // #1018
- M=D
- // #1019
- @SP
- // #1020
- M=M+1
- //vv push_d_to_stack
- //vv arith_cmp_op(JLT)
- //
- //// not
- //^^ arith_unary_op(!)
- //^^ pop_stack_to_d
- // #1021
- @SP
- // #1022
- M=M-1
- // #1023
- A=M
- // #1024
- D=M
- //vv pop_stack_to_d
- // #1025
- D=!D
- //^^ push_d_to_stack
- // #1026
- @SP
- // #1027
- A=M
- // #1028
- M=D
- // #1029
- @SP
- // #1030
- M=M+1
- //vv push_d_to_stack
- //vv arith_unary_op(!)
- //
- //// if-goto WHILE_END0
- //^^ pop_stack_to_d
- // #1031
- @SP
- // #1032
- M=M-1
- // #1033
- A=M
- // #1034
- D=M
- //vv pop_stack_to_d
- // #1035
- @Math.init$WHILE_END0
- // #1036
- D;JNE
- //
- //// push local 0
- //^^ push_from_ram(LCL, 0)
- // #1037
- @LCL
- // #1038
- D=M
- // #1039
- @0
- // #1040
- A=D+A
- // #1041
- D=M
- //^^ push_d_to_stack
- // #1042
- @SP
- // #1043
- A=M
- // #1044
- M=D
- // #1045
- @SP
- // #1046
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(LCL, 0)
- //
- //// push constant 1
- //^^ push_constant(1)
- // #1047
- @1
- // #1048
- D=A
- //^^ push_d_to_stack
- // #1049
- @SP
- // #1050
- A=M
- // #1051
- M=D
- // #1052
- @SP
- // #1053
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(1)
- //
- //// add
- //^^ arith_binary_op(+)
- //^^ pop_stack_to_d
- // #1054
- @SP
- // #1055
- M=M-1
- // #1056
- A=M
- // #1057
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D+M)
- // #1058
- @R13
- // #1059
- M=D
- //^^ pop_stack_to_d
- // #1060
- @SP
- // #1061
- M=M-1
- // #1062
- A=M
- // #1063
- D=M
- //vv pop_stack_to_d
- // #1064
- @R13
- // #1065
- D=D+M
- // #1066
- @R13
- // #1067
- M=0
- //vv arith_d_with_stack_top(D+M)
- //^^ push_d_to_stack
- // #1068
- @SP
- // #1069
- A=M
- // #1070
- M=D
- // #1071
- @SP
- // #1072
- M=M+1
- //vv push_d_to_stack
- //vv arith_binary_op(+)
- //
- //// pop local 0
- //^^ pop_to_ram(LCL, 0)
- // #1073
- @LCL
- // #1074
- D=M
- // #1075
- @0
- // #1076
- D=D+A
- // #1077
- @R13
- // #1078
- M=D
- //^^ pop_stack_to_d
- // #1079
- @SP
- // #1080
- M=M-1
- // #1081
- A=M
- // #1082
- D=M
- //vv pop_stack_to_d
- // #1083
- @R13
- // #1084
- A=M
- // #1085
- M=D
- // #1086
- @R13
- // #1087
- M=0
- //vv pop_to_ram(LCL, 0)
- //
- //// push local 0
- //^^ push_from_ram(LCL, 0)
- // #1088
- @LCL
- // #1089
- D=M
- // #1090
- @0
- // #1091
- A=D+A
- // #1092
- D=M
- //^^ push_d_to_stack
- // #1093
- @SP
- // #1094
- A=M
- // #1095
- M=D
- // #1096
- @SP
- // #1097
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(LCL, 0)
- //
- //// push static 0
- //^^ push_from_loc(Math.vm.0)
- // #1098
- @Math.vm.0
- // #1099
- D=M
- //^^ push_d_to_stack
- // #1100
- @SP
- // #1101
- A=M
- // #1102
- M=D
- // #1103
- @SP
- // #1104
- M=M+1
- //vv push_d_to_stack
- //vv push_from_loc(Math.vm.0)
- //
- //// add
- //^^ arith_binary_op(+)
- //^^ pop_stack_to_d
- // #1105
- @SP
- // #1106
- M=M-1
- // #1107
- A=M
- // #1108
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D+M)
- // #1109
- @R13
- // #1110
- M=D
- //^^ pop_stack_to_d
- // #1111
- @SP
- // #1112
- M=M-1
- // #1113
- A=M
- // #1114
- D=M
- //vv pop_stack_to_d
- // #1115
- @R13
- // #1116
- D=D+M
- // #1117
- @R13
- // #1118
- M=0
- //vv arith_d_with_stack_top(D+M)
- //^^ push_d_to_stack
- // #1119
- @SP
- // #1120
- A=M
- // #1121
- M=D
- // #1122
- @SP
- // #1123
- M=M+1
- //vv push_d_to_stack
- //vv arith_binary_op(+)
- //
- //// push local 0
- //^^ push_from_ram(LCL, 0)
- // #1124
- @LCL
- // #1125
- D=M
- // #1126
- @0
- // #1127
- A=D+A
- // #1128
- D=M
- //^^ push_d_to_stack
- // #1129
- @SP
- // #1130
- A=M
- // #1131
- M=D
- // #1132
- @SP
- // #1133
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(LCL, 0)
- //
- //// push constant 1
- //^^ push_constant(1)
- // #1134
- @1
- // #1135
- D=A
- //^^ push_d_to_stack
- // #1136
- @SP
- // #1137
- A=M
- // #1138
- M=D
- // #1139
- @SP
- // #1140
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(1)
- //
- //// sub
- //^^ arith_binary_op(-)
- //^^ pop_stack_to_d
- // #1141
- @SP
- // #1142
- M=M-1
- // #1143
- A=M
- // #1144
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D-M)
- // #1145
- @R13
- // #1146
- M=D
- //^^ pop_stack_to_d
- // #1147
- @SP
- // #1148
- M=M-1
- // #1149
- A=M
- // #1150
- D=M
- //vv pop_stack_to_d
- // #1151
- @R13
- // #1152
- D=D-M
- // #1153
- @R13
- // #1154
- M=0
- //vv arith_d_with_stack_top(D-M)
- //^^ push_d_to_stack
- // #1155
- @SP
- // #1156
- A=M
- // #1157
- M=D
- // #1158
- @SP
- // #1159
- M=M+1
- //vv push_d_to_stack
- //vv arith_binary_op(-)
- //
- //// push static 0
- //^^ push_from_loc(Math.vm.0)
- // #1160
- @Math.vm.0
- // #1161
- D=M
- //^^ push_d_to_stack
- // #1162
- @SP
- // #1163
- A=M
- // #1164
- M=D
- // #1165
- @SP
- // #1166
- M=M+1
- //vv push_d_to_stack
- //vv push_from_loc(Math.vm.0)
- //
- //// add
- //^^ arith_binary_op(+)
- //^^ pop_stack_to_d
- // #1167
- @SP
- // #1168
- M=M-1
- // #1169
- A=M
- // #1170
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D+M)
- // #1171
- @R13
- // #1172
- M=D
- //^^ pop_stack_to_d
- // #1173
- @SP
- // #1174
- M=M-1
- // #1175
- A=M
- // #1176
- D=M
- //vv pop_stack_to_d
- // #1177
- @R13
- // #1178
- D=D+M
- // #1179
- @R13
- // #1180
- M=0
- //vv arith_d_with_stack_top(D+M)
- //^^ push_d_to_stack
- // #1181
- @SP
- // #1182
- A=M
- // #1183
- M=D
- // #1184
- @SP
- // #1185
- M=M+1
- //vv push_d_to_stack
- //vv arith_binary_op(+)
- //
- //// pop pointer 1
- //^^ pop_to_loc{4)
- //^^ pop_stack_to_d
- // #1186
- @SP
- // #1187
- M=M-1
- // #1188
- A=M
- // #1189
- D=M
- //vv pop_stack_to_d
- // #1190
- @4
- // #1191
- M=D
- //vv pop_to_loc{4)
- //
- //// push that 0
- //^^ push_from_ram(THAT, 0)
- // #1192
- @THAT
- // #1193
- D=M
- // #1194
- @0
- // #1195
- A=D+A
- // #1196
- D=M
- //^^ push_d_to_stack
- // #1197
- @SP
- // #1198
- A=M
- // #1199
- M=D
- // #1200
- @SP
- // #1201
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(THAT, 0)
- //
- //// push local 0
- //^^ push_from_ram(LCL, 0)
- // #1202
- @LCL
- // #1203
- D=M
- // #1204
- @0
- // #1205
- A=D+A
- // #1206
- D=M
- //^^ push_d_to_stack
- // #1207
- @SP
- // #1208
- A=M
- // #1209
- M=D
- // #1210
- @SP
- // #1211
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(LCL, 0)
- //
- //// push constant 1
- //^^ push_constant(1)
- // #1212
- @1
- // #1213
- D=A
- //^^ push_d_to_stack
- // #1214
- @SP
- // #1215
- A=M
- // #1216
- M=D
- // #1217
- @SP
- // #1218
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(1)
- //
- //// sub
- //^^ arith_binary_op(-)
- //^^ pop_stack_to_d
- // #1219
- @SP
- // #1220
- M=M-1
- // #1221
- A=M
- // #1222
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D-M)
- // #1223
- @R13
- // #1224
- M=D
- //^^ pop_stack_to_d
- // #1225
- @SP
- // #1226
- M=M-1
- // #1227
- A=M
- // #1228
- D=M
- //vv pop_stack_to_d
- // #1229
- @R13
- // #1230
- D=D-M
- // #1231
- @R13
- // #1232
- M=0
- //vv arith_d_with_stack_top(D-M)
- //^^ push_d_to_stack
- // #1233
- @SP
- // #1234
- A=M
- // #1235
- M=D
- // #1236
- @SP
- // #1237
- M=M+1
- //vv push_d_to_stack
- //vv arith_binary_op(-)
- //
- //// push static 0
- //^^ push_from_loc(Math.vm.0)
- // #1238
- @Math.vm.0
- // #1239
- D=M
- //^^ push_d_to_stack
- // #1240
- @SP
- // #1241
- A=M
- // #1242
- M=D
- // #1243
- @SP
- // #1244
- M=M+1
- //vv push_d_to_stack
- //vv push_from_loc(Math.vm.0)
- //
- //// add
- //^^ arith_binary_op(+)
- //^^ pop_stack_to_d
- // #1245
- @SP
- // #1246
- M=M-1
- // #1247
- A=M
- // #1248
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D+M)
- // #1249
- @R13
- // #1250
- M=D
- //^^ pop_stack_to_d
- // #1251
- @SP
- // #1252
- M=M-1
- // #1253
- A=M
- // #1254
- D=M
- //vv pop_stack_to_d
- // #1255
- @R13
- // #1256
- D=D+M
- // #1257
- @R13
- // #1258
- M=0
- //vv arith_d_with_stack_top(D+M)
- //^^ push_d_to_stack
- // #1259
- @SP
- // #1260
- A=M
- // #1261
- M=D
- // #1262
- @SP
- // #1263
- M=M+1
- //vv push_d_to_stack
- //vv arith_binary_op(+)
- //
- //// pop pointer 1
- //^^ pop_to_loc{4)
- //^^ pop_stack_to_d
- // #1264
- @SP
- // #1265
- M=M-1
- // #1266
- A=M
- // #1267
- D=M
- //vv pop_stack_to_d
- // #1268
- @4
- // #1269
- M=D
- //vv pop_to_loc{4)
- //
- //// push that 0
- //^^ push_from_ram(THAT, 0)
- // #1270
- @THAT
- // #1271
- D=M
- // #1272
- @0
- // #1273
- A=D+A
- // #1274
- D=M
- //^^ push_d_to_stack
- // #1275
- @SP
- // #1276
- A=M
- // #1277
- M=D
- // #1278
- @SP
- // #1279
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(THAT, 0)
- //
- //// add
- //^^ arith_binary_op(+)
- //^^ pop_stack_to_d
- // #1280
- @SP
- // #1281
- M=M-1
- // #1282
- A=M
- // #1283
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D+M)
- // #1284
- @R13
- // #1285
- M=D
- //^^ pop_stack_to_d
- // #1286
- @SP
- // #1287
- M=M-1
- // #1288
- A=M
- // #1289
- D=M
- //vv pop_stack_to_d
- // #1290
- @R13
- // #1291
- D=D+M
- // #1292
- @R13
- // #1293
- M=0
- //vv arith_d_with_stack_top(D+M)
- //^^ push_d_to_stack
- // #1294
- @SP
- // #1295
- A=M
- // #1296
- M=D
- // #1297
- @SP
- // #1298
- M=M+1
- //vv push_d_to_stack
- //vv arith_binary_op(+)
- //
- //// pop temp 0
- //^^ pop_to_loc{5)
- //^^ pop_stack_to_d
- // #1299
- @SP
- // #1300
- M=M-1
- // #1301
- A=M
- // #1302
- D=M
- //vv pop_stack_to_d
- // #1303
- @5
- // #1304
- M=D
- //vv pop_to_loc{5)
- //
- //// pop pointer 1
- //^^ pop_to_loc{4)
- //^^ pop_stack_to_d
- // #1305
- @SP
- // #1306
- M=M-1
- // #1307
- A=M
- // #1308
- D=M
- //vv pop_stack_to_d
- // #1309
- @4
- // #1310
- M=D
- //vv pop_to_loc{4)
- //
- //// push temp 0
- //^^ push_from_loc(5)
- // #1311
- @5
- // #1312
- D=M
- //^^ push_d_to_stack
- // #1313
- @SP
- // #1314
- A=M
- // #1315
- M=D
- // #1316
- @SP
- // #1317
- M=M+1
- //vv push_d_to_stack
- //vv push_from_loc(5)
- //
- //// pop that 0
- //^^ pop_to_ram(THAT, 0)
- // #1318
- @THAT
- // #1319
- D=M
- // #1320
- @0
- // #1321
- D=D+A
- // #1322
- @R13
- // #1323
- M=D
- //^^ pop_stack_to_d
- // #1324
- @SP
- // #1325
- M=M-1
- // #1326
- A=M
- // #1327
- D=M
- //vv pop_stack_to_d
- // #1328
- @R13
- // #1329
- A=M
- // #1330
- M=D
- // #1331
- @R13
- // #1332
- M=0
- //vv pop_to_ram(THAT, 0)
- //
- //// goto WHILE_EXP0
- // #1333
- @Math.init$WHILE_EXP0
- // #1334
- 0;JMP
- //
- //// label WHILE_END0
- (Math.init$WHILE_END0)
- //
- //// push constant 0
- //^^ push_constant(0)
- // #1335
- @0
- // #1336
- D=A
- //^^ push_d_to_stack
- // #1337
- @SP
- // #1338
- A=M
- // #1339
- M=D
- // #1340
- @SP
- // #1341
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(0)
- //
- //// return
- // #1342
- @LCL
- // #1343
- D=M
- // #1344
- @R14
- // #1345
- M=D //R14=LCL
- // #1346
- @5
- // #1347
- A=D-A
- // #1348
- D=M
- // #1349
- @R15
- // #1350
- M=D //R15=*(LCL-5)
- //^^ pop_stack_to_d
- // #1351
- @SP
- // #1352
- M=M-1
- // #1353
- A=M
- // #1354
- D=M
- //vv pop_stack_to_d
- // #1355
- @ARG
- // #1356
- A=M
- // #1357
- M=D //*ARG = pop()
- // #1358
- @ARG
- // #1359
- D=M
- // #1360
- @SP
- // #1361
- M=D+1 //SP=ARG+1
- // #1362
- @R14
- // #1363
- AM=M-1
- // #1364
- D=M
- // #1365
- @THAT
- // #1366
- M=D //THAT = *(--R14)
- // #1367
- @R14
- // #1368
- AM=M-1
- // #1369
- D=M
- // #1370
- @THIS
- // #1371
- M=D //THIS = *(--R14)
- // #1372
- @R14
- // #1373
- AM=M-1
- // #1374
- D=M
- // #1375
- @ARG
- // #1376
- M=D //ARG = *(--R14)
- // #1377
- @R14
- // #1378
- AM=M-1
- // #1379
- D=M
- // #1380
- @LCL
- // #1381
- M=D //LCL = *(--R14)
- // #1382
- @R15
- // #1383
- A=M
- // #1384
- 0;JMP //goto *R15
- //
- //// function Math.abs 0
- (Math.abs)
- //
- //// push argument 0
- //^^ push_from_ram(ARG, 0)
- // #1385
- @ARG
- // #1386
- D=M
- // #1387
- @0
- // #1388
- A=D+A
- // #1389
- D=M
- //^^ push_d_to_stack
- // #1390
- @SP
- // #1391
- A=M
- // #1392
- M=D
- // #1393
- @SP
- // #1394
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(ARG, 0)
- //
- //// push constant 0
- //^^ push_constant(0)
- // #1395
- @0
- // #1396
- D=A
- //^^ push_d_to_stack
- // #1397
- @SP
- // #1398
- A=M
- // #1399
- M=D
- // #1400
- @SP
- // #1401
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(0)
- //
- //// lt
- //^^ arith_cmp_op(JLT)
- //^^ pop_stack_to_d
- // #1402
- @SP
- // #1403
- M=M-1
- // #1404
- A=M
- // #1405
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D-M)
- // #1406
- @R13
- // #1407
- M=D
- //^^ pop_stack_to_d
- // #1408
- @SP
- // #1409
- M=M-1
- // #1410
- A=M
- // #1411
- D=M
- //vv pop_stack_to_d
- // #1412
- @R13
- // #1413
- D=D-M
- // #1414
- @R13
- // #1415
- M=0
- //vv arith_d_with_stack_top(D-M)
- // #1416
- @PUT_TRUE_32
- // #1417
- D;JLT
- // #1418
- @R13
- // #1419
- M=0
- // #1420
- @CONT_32
- // #1421
- 0;JMP
- (PUT_TRUE_32)
- // #1422
- @R13
- // #1423
- M=-1
- (CONT_32)
- // #1424
- @R13
- // #1425
- D=M
- // #1426
- @R13
- // #1427
- M=0
- //^^ push_d_to_stack
- // #1428
- @SP
- // #1429
- A=M
- // #1430
- M=D
- // #1431
- @SP
- // #1432
- M=M+1
- //vv push_d_to_stack
- //vv arith_cmp_op(JLT)
- //
- //// if-goto IF_TRUE0
- //^^ pop_stack_to_d
- // #1433
- @SP
- // #1434
- M=M-1
- // #1435
- A=M
- // #1436
- D=M
- //vv pop_stack_to_d
- // #1437
- @Math.abs$IF_TRUE0
- // #1438
- D;JNE
- //
- //// goto IF_FALSE0
- // #1439
- @Math.abs$IF_FALSE0
- // #1440
- 0;JMP
- //
- //// label IF_TRUE0
- (Math.abs$IF_TRUE0)
- //
- //// push argument 0
- //^^ push_from_ram(ARG, 0)
- // #1441
- @ARG
- // #1442
- D=M
- // #1443
- @0
- // #1444
- A=D+A
- // #1445
- D=M
- //^^ push_d_to_stack
- // #1446
- @SP
- // #1447
- A=M
- // #1448
- M=D
- // #1449
- @SP
- // #1450
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(ARG, 0)
- //
- //// neg
- //^^ arith_unary_op(-)
- //^^ pop_stack_to_d
- // #1451
- @SP
- // #1452
- M=M-1
- // #1453
- A=M
- // #1454
- D=M
- //vv pop_stack_to_d
- // #1455
- D=-D
- //^^ push_d_to_stack
- // #1456
- @SP
- // #1457
- A=M
- // #1458
- M=D
- // #1459
- @SP
- // #1460
- M=M+1
- //vv push_d_to_stack
- //vv arith_unary_op(-)
- //
- //// pop argument 0
- //^^ pop_to_ram(ARG, 0)
- // #1461
- @ARG
- // #1462
- D=M
- // #1463
- @0
- // #1464
- D=D+A
- // #1465
- @R13
- // #1466
- M=D
- //^^ pop_stack_to_d
- // #1467
- @SP
- // #1468
- M=M-1
- // #1469
- A=M
- // #1470
- D=M
- //vv pop_stack_to_d
- // #1471
- @R13
- // #1472
- A=M
- // #1473
- M=D
- // #1474
- @R13
- // #1475
- M=0
- //vv pop_to_ram(ARG, 0)
- //
- //// label IF_FALSE0
- (Math.abs$IF_FALSE0)
- //
- //// push argument 0
- //^^ push_from_ram(ARG, 0)
- // #1476
- @ARG
- // #1477
- D=M
- // #1478
- @0
- // #1479
- A=D+A
- // #1480
- D=M
- //^^ push_d_to_stack
- // #1481
- @SP
- // #1482
- A=M
- // #1483
- M=D
- // #1484
- @SP
- // #1485
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(ARG, 0)
- //
- //// return
- // #1486
- @LCL
- // #1487
- D=M
- // #1488
- @R14
- // #1489
- M=D //R14=LCL
- // #1490
- @5
- // #1491
- A=D-A
- // #1492
- D=M
- // #1493
- @R15
- // #1494
- M=D //R15=*(LCL-5)
- //^^ pop_stack_to_d
- // #1495
- @SP
- // #1496
- M=M-1
- // #1497
- A=M
- // #1498
- D=M
- //vv pop_stack_to_d
- // #1499
- @ARG
- // #1500
- A=M
- // #1501
- M=D //*ARG = pop()
- // #1502
- @ARG
- // #1503
- D=M
- // #1504
- @SP
- // #1505
- M=D+1 //SP=ARG+1
- // #1506
- @R14
- // #1507
- AM=M-1
- // #1508
- D=M
- // #1509
- @THAT
- // #1510
- M=D //THAT = *(--R14)
- // #1511
- @R14
- // #1512
- AM=M-1
- // #1513
- D=M
- // #1514
- @THIS
- // #1515
- M=D //THIS = *(--R14)
- // #1516
- @R14
- // #1517
- AM=M-1
- // #1518
- D=M
- // #1519
- @ARG
- // #1520
- M=D //ARG = *(--R14)
- // #1521
- @R14
- // #1522
- AM=M-1
- // #1523
- D=M
- // #1524
- @LCL
- // #1525
- M=D //LCL = *(--R14)
- // #1526
- @R15
- // #1527
- A=M
- // #1528
- 0;JMP //goto *R15
- //
- //// function Math.multiply 5
- (Math.multiply)
- // #1529
- D=0
- //^^ push_d_to_stack
- // #1530
- @SP
- // #1531
- A=M
- // #1532
- M=D
- // #1533
- @SP
- // #1534
- M=M+1
- //vv push_d_to_stack
- // #1535
- D=0
- //^^ push_d_to_stack
- // #1536
- @SP
- // #1537
- A=M
- // #1538
- M=D
- // #1539
- @SP
- // #1540
- M=M+1
- //vv push_d_to_stack
- // #1541
- D=0
- //^^ push_d_to_stack
- // #1542
- @SP
- // #1543
- A=M
- // #1544
- M=D
- // #1545
- @SP
- // #1546
- M=M+1
- //vv push_d_to_stack
- // #1547
- D=0
- //^^ push_d_to_stack
- // #1548
- @SP
- // #1549
- A=M
- // #1550
- M=D
- // #1551
- @SP
- // #1552
- M=M+1
- //vv push_d_to_stack
- // #1553
- D=0
- //^^ push_d_to_stack
- // #1554
- @SP
- // #1555
- A=M
- // #1556
- M=D
- // #1557
- @SP
- // #1558
- M=M+1
- //vv push_d_to_stack
- //
- //// push argument 0
- //^^ push_from_ram(ARG, 0)
- // #1559
- @ARG
- // #1560
- D=M
- // #1561
- @0
- // #1562
- A=D+A
- // #1563
- D=M
- //^^ push_d_to_stack
- // #1564
- @SP
- // #1565
- A=M
- // #1566
- M=D
- // #1567
- @SP
- // #1568
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(ARG, 0)
- //
- //// push constant 0
- //^^ push_constant(0)
- // #1569
- @0
- // #1570
- D=A
- //^^ push_d_to_stack
- // #1571
- @SP
- // #1572
- A=M
- // #1573
- M=D
- // #1574
- @SP
- // #1575
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(0)
- //
- //// lt
- //^^ arith_cmp_op(JLT)
- //^^ pop_stack_to_d
- // #1576
- @SP
- // #1577
- M=M-1
- // #1578
- A=M
- // #1579
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D-M)
- // #1580
- @R13
- // #1581
- M=D
- //^^ pop_stack_to_d
- // #1582
- @SP
- // #1583
- M=M-1
- // #1584
- A=M
- // #1585
- D=M
- //vv pop_stack_to_d
- // #1586
- @R13
- // #1587
- D=D-M
- // #1588
- @R13
- // #1589
- M=0
- //vv arith_d_with_stack_top(D-M)
- // #1590
- @PUT_TRUE_33
- // #1591
- D;JLT
- // #1592
- @R13
- // #1593
- M=0
- // #1594
- @CONT_33
- // #1595
- 0;JMP
- (PUT_TRUE_33)
- // #1596
- @R13
- // #1597
- M=-1
- (CONT_33)
- // #1598
- @R13
- // #1599
- D=M
- // #1600
- @R13
- // #1601
- M=0
- //^^ push_d_to_stack
- // #1602
- @SP
- // #1603
- A=M
- // #1604
- M=D
- // #1605
- @SP
- // #1606
- M=M+1
- //vv push_d_to_stack
- //vv arith_cmp_op(JLT)
- //
- //// push argument 1
- //^^ push_from_ram(ARG, 1)
- // #1607
- @ARG
- // #1608
- D=M
- // #1609
- @1
- // #1610
- A=D+A
- // #1611
- D=M
- //^^ push_d_to_stack
- // #1612
- @SP
- // #1613
- A=M
- // #1614
- M=D
- // #1615
- @SP
- // #1616
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(ARG, 1)
- //
- //// push constant 0
- //^^ push_constant(0)
- // #1617
- @0
- // #1618
- D=A
- //^^ push_d_to_stack
- // #1619
- @SP
- // #1620
- A=M
- // #1621
- M=D
- // #1622
- @SP
- // #1623
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(0)
- //
- //// gt
- //^^ arith_cmp_op(JGT)
- //^^ pop_stack_to_d
- // #1624
- @SP
- // #1625
- M=M-1
- // #1626
- A=M
- // #1627
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D-M)
- // #1628
- @R13
- // #1629
- M=D
- //^^ pop_stack_to_d
- // #1630
- @SP
- // #1631
- M=M-1
- // #1632
- A=M
- // #1633
- D=M
- //vv pop_stack_to_d
- // #1634
- @R13
- // #1635
- D=D-M
- // #1636
- @R13
- // #1637
- M=0
- //vv arith_d_with_stack_top(D-M)
- // #1638
- @PUT_TRUE_34
- // #1639
- D;JGT
- // #1640
- @R13
- // #1641
- M=0
- // #1642
- @CONT_34
- // #1643
- 0;JMP
- (PUT_TRUE_34)
- // #1644
- @R13
- // #1645
- M=-1
- (CONT_34)
- // #1646
- @R13
- // #1647
- D=M
- // #1648
- @R13
- // #1649
- M=0
- //^^ push_d_to_stack
- // #1650
- @SP
- // #1651
- A=M
- // #1652
- M=D
- // #1653
- @SP
- // #1654
- M=M+1
- //vv push_d_to_stack
- //vv arith_cmp_op(JGT)
- //
- //// and
- //^^ arith_binary_op(&)
- //^^ pop_stack_to_d
- // #1655
- @SP
- // #1656
- M=M-1
- // #1657
- A=M
- // #1658
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D&M)
- // #1659
- @R13
- // #1660
- M=D
- //^^ pop_stack_to_d
- // #1661
- @SP
- // #1662
- M=M-1
- // #1663
- A=M
- // #1664
- D=M
- //vv pop_stack_to_d
- // #1665
- @R13
- // #1666
- D=D&M
- // #1667
- @R13
- // #1668
- M=0
- //vv arith_d_with_stack_top(D&M)
- //^^ push_d_to_stack
- // #1669
- @SP
- // #1670
- A=M
- // #1671
- M=D
- // #1672
- @SP
- // #1673
- M=M+1
- //vv push_d_to_stack
- //vv arith_binary_op(&)
- //
- //// push argument 0
- //^^ push_from_ram(ARG, 0)
- // #1674
- @ARG
- // #1675
- D=M
- // #1676
- @0
- // #1677
- A=D+A
- // #1678
- D=M
- //^^ push_d_to_stack
- // #1679
- @SP
- // #1680
- A=M
- // #1681
- M=D
- // #1682
- @SP
- // #1683
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(ARG, 0)
- //
- //// push constant 0
- //^^ push_constant(0)
- // #1684
- @0
- // #1685
- D=A
- //^^ push_d_to_stack
- // #1686
- @SP
- // #1687
- A=M
- // #1688
- M=D
- // #1689
- @SP
- // #1690
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(0)
- //
- //// gt
- //^^ arith_cmp_op(JGT)
- //^^ pop_stack_to_d
- // #1691
- @SP
- // #1692
- M=M-1
- // #1693
- A=M
- // #1694
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D-M)
- // #1695
- @R13
- // #1696
- M=D
- //^^ pop_stack_to_d
- // #1697
- @SP
- // #1698
- M=M-1
- // #1699
- A=M
- // #1700
- D=M
- //vv pop_stack_to_d
- // #1701
- @R13
- // #1702
- D=D-M
- // #1703
- @R13
- // #1704
- M=0
- //vv arith_d_with_stack_top(D-M)
- // #1705
- @PUT_TRUE_35
- // #1706
- D;JGT
- // #1707
- @R13
- // #1708
- M=0
- // #1709
- @CONT_35
- // #1710
- 0;JMP
- (PUT_TRUE_35)
- // #1711
- @R13
- // #1712
- M=-1
- (CONT_35)
- // #1713
- @R13
- // #1714
- D=M
- // #1715
- @R13
- // #1716
- M=0
- //^^ push_d_to_stack
- // #1717
- @SP
- // #1718
- A=M
- // #1719
- M=D
- // #1720
- @SP
- // #1721
- M=M+1
- //vv push_d_to_stack
- //vv arith_cmp_op(JGT)
- //
- //// push argument 1
- //^^ push_from_ram(ARG, 1)
- // #1722
- @ARG
- // #1723
- D=M
- // #1724
- @1
- // #1725
- A=D+A
- // #1726
- D=M
- //^^ push_d_to_stack
- // #1727
- @SP
- // #1728
- A=M
- // #1729
- M=D
- // #1730
- @SP
- // #1731
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(ARG, 1)
- //
- //// push constant 0
- //^^ push_constant(0)
- // #1732
- @0
- // #1733
- D=A
- //^^ push_d_to_stack
- // #1734
- @SP
- // #1735
- A=M
- // #1736
- M=D
- // #1737
- @SP
- // #1738
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(0)
- //
- //// lt
- //^^ arith_cmp_op(JLT)
- //^^ pop_stack_to_d
- // #1739
- @SP
- // #1740
- M=M-1
- // #1741
- A=M
- // #1742
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D-M)
- // #1743
- @R13
- // #1744
- M=D
- //^^ pop_stack_to_d
- // #1745
- @SP
- // #1746
- M=M-1
- // #1747
- A=M
- // #1748
- D=M
- //vv pop_stack_to_d
- // #1749
- @R13
- // #1750
- D=D-M
- // #1751
- @R13
- // #1752
- M=0
- //vv arith_d_with_stack_top(D-M)
- // #1753
- @PUT_TRUE_36
- // #1754
- D;JLT
- // #1755
- @R13
- // #1756
- M=0
- // #1757
- @CONT_36
- // #1758
- 0;JMP
- (PUT_TRUE_36)
- // #1759
- @R13
- // #1760
- M=-1
- (CONT_36)
- // #1761
- @R13
- // #1762
- D=M
- // #1763
- @R13
- // #1764
- M=0
- //^^ push_d_to_stack
- // #1765
- @SP
- // #1766
- A=M
- // #1767
- M=D
- // #1768
- @SP
- // #1769
- M=M+1
- //vv push_d_to_stack
- //vv arith_cmp_op(JLT)
- //
- //// and
- //^^ arith_binary_op(&)
- //^^ pop_stack_to_d
- // #1770
- @SP
- // #1771
- M=M-1
- // #1772
- A=M
- // #1773
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D&M)
- // #1774
- @R13
- // #1775
- M=D
- //^^ pop_stack_to_d
- // #1776
- @SP
- // #1777
- M=M-1
- // #1778
- A=M
- // #1779
- D=M
- //vv pop_stack_to_d
- // #1780
- @R13
- // #1781
- D=D&M
- // #1782
- @R13
- // #1783
- M=0
- //vv arith_d_with_stack_top(D&M)
- //^^ push_d_to_stack
- // #1784
- @SP
- // #1785
- A=M
- // #1786
- M=D
- // #1787
- @SP
- // #1788
- M=M+1
- //vv push_d_to_stack
- //vv arith_binary_op(&)
- //
- //// or
- //^^ arith_binary_op(|)
- //^^ pop_stack_to_d
- // #1789
- @SP
- // #1790
- M=M-1
- // #1791
- A=M
- // #1792
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D|M)
- // #1793
- @R13
- // #1794
- M=D
- //^^ pop_stack_to_d
- // #1795
- @SP
- // #1796
- M=M-1
- // #1797
- A=M
- // #1798
- D=M
- //vv pop_stack_to_d
- // #1799
- @R13
- // #1800
- D=D|M
- // #1801
- @R13
- // #1802
- M=0
- //vv arith_d_with_stack_top(D|M)
- //^^ push_d_to_stack
- // #1803
- @SP
- // #1804
- A=M
- // #1805
- M=D
- // #1806
- @SP
- // #1807
- M=M+1
- //vv push_d_to_stack
- //vv arith_binary_op(|)
- //
- //// pop local 4
- //^^ pop_to_ram(LCL, 4)
- // #1808
- @LCL
- // #1809
- D=M
- // #1810
- @4
- // #1811
- D=D+A
- // #1812
- @R13
- // #1813
- M=D
- //^^ pop_stack_to_d
- // #1814
- @SP
- // #1815
- M=M-1
- // #1816
- A=M
- // #1817
- D=M
- //vv pop_stack_to_d
- // #1818
- @R13
- // #1819
- A=M
- // #1820
- M=D
- // #1821
- @R13
- // #1822
- M=0
- //vv pop_to_ram(LCL, 4)
- //
- //// push argument 0
- //^^ push_from_ram(ARG, 0)
- // #1823
- @ARG
- // #1824
- D=M
- // #1825
- @0
- // #1826
- A=D+A
- // #1827
- D=M
- //^^ push_d_to_stack
- // #1828
- @SP
- // #1829
- A=M
- // #1830
- M=D
- // #1831
- @SP
- // #1832
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(ARG, 0)
- //
- //// call Math.abs 1
- //^^ push_constant(RET_ADDR_37)
- // #1833
- @RET_ADDR_37
- // #1834
- D=A
- //^^ push_d_to_stack
- // #1835
- @SP
- // #1836
- A=M
- // #1837
- M=D
- // #1838
- @SP
- // #1839
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(RET_ADDR_37)
- //push return-address
- // #1840
- @LCL
- // #1841
- D=M
- //^^ push_d_to_stack
- // #1842
- @SP
- // #1843
- A=M
- // #1844
- M=D
- // #1845
- @SP
- // #1846
- M=M+1
- //vv push_d_to_stack
- //push LCL
- // #1847
- @ARG
- // #1848
- D=M
- //^^ push_d_to_stack
- // #1849
- @SP
- // #1850
- A=M
- // #1851
- M=D
- // #1852
- @SP
- // #1853
- M=M+1
- //vv push_d_to_stack
- //push ARG
- // #1854
- @THIS
- // #1855
- D=M
- //^^ push_d_to_stack
- // #1856
- @SP
- // #1857
- A=M
- // #1858
- M=D
- // #1859
- @SP
- // #1860
- M=M+1
- //vv push_d_to_stack
- //push THIS
- // #1861
- @THAT
- // #1862
- D=M
- //^^ push_d_to_stack
- // #1863
- @SP
- // #1864
- A=M
- // #1865
- M=D
- // #1866
- @SP
- // #1867
- M=M+1
- //vv push_d_to_stack
- //push THAT
- // #1868
- @SP
- // #1869
- D=M
- // #1870
- @ARG
- // #1871
- M=D
- // #1872
- @6
- // #1873
- D=A
- // #1874
- @ARG
- // #1875
- M=M-D // ARG = SP - args - 5
- // #1876
- @SP
- // #1877
- D=M
- // #1878
- @LCL
- // #1879
- M=D // LCL = SP
- // #1880
- @Math.abs
- // #1881
- 0;JMP
- (RET_ADDR_37)
- //
- //// pop argument 0
- //^^ pop_to_ram(ARG, 0)
- // #1882
- @ARG
- // #1883
- D=M
- // #1884
- @0
- // #1885
- D=D+A
- // #1886
- @R13
- // #1887
- M=D
- //^^ pop_stack_to_d
- // #1888
- @SP
- // #1889
- M=M-1
- // #1890
- A=M
- // #1891
- D=M
- //vv pop_stack_to_d
- // #1892
- @R13
- // #1893
- A=M
- // #1894
- M=D
- // #1895
- @R13
- // #1896
- M=0
- //vv pop_to_ram(ARG, 0)
- //
- //// push argument 1
- //^^ push_from_ram(ARG, 1)
- // #1897
- @ARG
- // #1898
- D=M
- // #1899
- @1
- // #1900
- A=D+A
- // #1901
- D=M
- //^^ push_d_to_stack
- // #1902
- @SP
- // #1903
- A=M
- // #1904
- M=D
- // #1905
- @SP
- // #1906
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(ARG, 1)
- //
- //// call Math.abs 1
- //^^ push_constant(RET_ADDR_38)
- // #1907
- @RET_ADDR_38
- // #1908
- D=A
- //^^ push_d_to_stack
- // #1909
- @SP
- // #1910
- A=M
- // #1911
- M=D
- // #1912
- @SP
- // #1913
- M=M+1
- //vv push_d_to_stack
- //vv push_constant(RET_ADDR_38)
- //push return-address
- // #1914
- @LCL
- // #1915
- D=M
- //^^ push_d_to_stack
- // #1916
- @SP
- // #1917
- A=M
- // #1918
- M=D
- // #1919
- @SP
- // #1920
- M=M+1
- //vv push_d_to_stack
- //push LCL
- // #1921
- @ARG
- // #1922
- D=M
- //^^ push_d_to_stack
- // #1923
- @SP
- // #1924
- A=M
- // #1925
- M=D
- // #1926
- @SP
- // #1927
- M=M+1
- //vv push_d_to_stack
- //push ARG
- // #1928
- @THIS
- // #1929
- D=M
- //^^ push_d_to_stack
- // #1930
- @SP
- // #1931
- A=M
- // #1932
- M=D
- // #1933
- @SP
- // #1934
- M=M+1
- //vv push_d_to_stack
- //push THIS
- // #1935
- @THAT
- // #1936
- D=M
- //^^ push_d_to_stack
- // #1937
- @SP
- // #1938
- A=M
- // #1939
- M=D
- // #1940
- @SP
- // #1941
- M=M+1
- //vv push_d_to_stack
- //push THAT
- // #1942
- @SP
- // #1943
- D=M
- // #1944
- @ARG
- // #1945
- M=D
- // #1946
- @6
- // #1947
- D=A
- // #1948
- @ARG
- // #1949
- M=M-D // ARG = SP - args - 5
- // #1950
- @SP
- // #1951
- D=M
- // #1952
- @LCL
- // #1953
- M=D // LCL = SP
- // #1954
- @Math.abs
- // #1955
- 0;JMP
- (RET_ADDR_38)
- //
- //// pop argument 1
- //^^ pop_to_ram(ARG, 1)
- // #1956
- @ARG
- // #1957
- D=M
- // #1958
- @1
- // #1959
- D=D+A
- // #1960
- @R13
- // #1961
- M=D
- //^^ pop_stack_to_d
- // #1962
- @SP
- // #1963
- M=M-1
- // #1964
- A=M
- // #1965
- D=M
- //vv pop_stack_to_d
- // #1966
- @R13
- // #1967
- A=M
- // #1968
- M=D
- // #1969
- @R13
- // #1970
- M=0
- //vv pop_to_ram(ARG, 1)
- //
- //// push argument 0
- //^^ push_from_ram(ARG, 0)
- // #1971
- @ARG
- // #1972
- D=M
- // #1973
- @0
- // #1974
- A=D+A
- // #1975
- D=M
- //^^ push_d_to_stack
- // #1976
- @SP
- // #1977
- A=M
- // #1978
- M=D
- // #1979
- @SP
- // #1980
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(ARG, 0)
- //
- //// push argument 1
- //^^ push_from_ram(ARG, 1)
- // #1981
- @ARG
- // #1982
- D=M
- // #1983
- @1
- // #1984
- A=D+A
- // #1985
- D=M
- //^^ push_d_to_stack
- // #1986
- @SP
- // #1987
- A=M
- // #1988
- M=D
- // #1989
- @SP
- // #1990
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(ARG, 1)
- //
- //// lt
- //^^ arith_cmp_op(JLT)
- //^^ pop_stack_to_d
- // #1991
- @SP
- // #1992
- M=M-1
- // #1993
- A=M
- // #1994
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D-M)
- // #1995
- @R13
- // #1996
- M=D
- //^^ pop_stack_to_d
- // #1997
- @SP
- // #1998
- M=M-1
- // #1999
- A=M
- // #2000
- D=M
- //vv pop_stack_to_d
- // #2001
- @R13
- // #2002
- D=D-M
- // #2003
- @R13
- // #2004
- M=0
- //vv arith_d_with_stack_top(D-M)
- // #2005
- @PUT_TRUE_39
- // #2006
- D;JLT
- // #2007
- @R13
- // #2008
- M=0
- // #2009
- @CONT_39
- // #2010
- 0;JMP
- (PUT_TRUE_39)
- // #2011
- @R13
- // #2012
- M=-1
- (CONT_39)
- // #2013
- @R13
- // #2014
- D=M
- // #2015
- @R13
- // #2016
- M=0
- //^^ push_d_to_stack
- // #2017
- @SP
- // #2018
- A=M
- // #2019
- M=D
- // #2020
- @SP
- // #2021
- M=M+1
- //vv push_d_to_stack
- //vv arith_cmp_op(JLT)
- //
- //// if-goto IF_TRUE0
- //^^ pop_stack_to_d
- // #2022
- @SP
- // #2023
- M=M-1
- // #2024
- A=M
- // #2025
- D=M
- //vv pop_stack_to_d
- // #2026
- @Math.multiply$IF_TRUE0
- // #2027
- D;JNE
- //
- //// goto IF_FALSE0
- // #2028
- @Math.multiply$IF_FALSE0
- // #2029
- 0;JMP
- //
- //// label IF_TRUE0
- (Math.multiply$IF_TRUE0)
- //
- //// push argument 0
- //^^ push_from_ram(ARG, 0)
- // #2030
- @ARG
- // #2031
- D=M
- // #2032
- @0
- // #2033
- A=D+A
- // #2034
- D=M
- //^^ push_d_to_stack
- // #2035
- @SP
- // #2036
- A=M
- // #2037
- M=D
- // #2038
- @SP
- // #2039
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(ARG, 0)
- //
- //// pop local 1
- //^^ pop_to_ram(LCL, 1)
- // #2040
- @LCL
- // #2041
- D=M
- // #2042
- @1
- // #2043
- D=D+A
- // #2044
- @R13
- // #2045
- M=D
- //^^ pop_stack_to_d
- // #2046
- @SP
- // #2047
- M=M-1
- // #2048
- A=M
- // #2049
- D=M
- //vv pop_stack_to_d
- // #2050
- @R13
- // #2051
- A=M
- // #2052
- M=D
- // #2053
- @R13
- // #2054
- M=0
- //vv pop_to_ram(LCL, 1)
- //
- //// push argument 1
- //^^ push_from_ram(ARG, 1)
- // #2055
- @ARG
- // #2056
- D=M
- // #2057
- @1
- // #2058
- A=D+A
- // #2059
- D=M
- //^^ push_d_to_stack
- // #2060
- @SP
- // #2061
- A=M
- // #2062
- M=D
- // #2063
- @SP
- // #2064
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(ARG, 1)
- //
- //// pop argument 0
- //^^ pop_to_ram(ARG, 0)
- // #2065
- @ARG
- // #2066
- D=M
- // #2067
- @0
- // #2068
- D=D+A
- // #2069
- @R13
- // #2070
- M=D
- //^^ pop_stack_to_d
- // #2071
- @SP
- // #2072
- M=M-1
- // #2073
- A=M
- // #2074
- D=M
- //vv pop_stack_to_d
- // #2075
- @R13
- // #2076
- A=M
- // #2077
- M=D
- // #2078
- @R13
- // #2079
- M=0
- //vv pop_to_ram(ARG, 0)
- //
- //// push local 1
- //^^ push_from_ram(LCL, 1)
- // #2080
- @LCL
- // #2081
- D=M
- // #2082
- @1
- // #2083
- A=D+A
- // #2084
- D=M
- //^^ push_d_to_stack
- // #2085
- @SP
- // #2086
- A=M
- // #2087
- M=D
- // #2088
- @SP
- // #2089
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(LCL, 1)
- //
- //// pop argument 1
- //^^ pop_to_ram(ARG, 1)
- // #2090
- @ARG
- // #2091
- D=M
- // #2092
- @1
- // #2093
- D=D+A
- // #2094
- @R13
- // #2095
- M=D
- //^^ pop_stack_to_d
- // #2096
- @SP
- // #2097
- M=M-1
- // #2098
- A=M
- // #2099
- D=M
- //vv pop_stack_to_d
- // #2100
- @R13
- // #2101
- A=M
- // #2102
- M=D
- // #2103
- @R13
- // #2104
- M=0
- //vv pop_to_ram(ARG, 1)
- //
- //// label IF_FALSE0
- (Math.multiply$IF_FALSE0)
- //
- //// label WHILE_EXP0
- (Math.multiply$WHILE_EXP0)
- //
- //// push local 2
- //^^ push_from_ram(LCL, 2)
- // #2105
- @LCL
- // #2106
- D=M
- // #2107
- @2
- // #2108
- A=D+A
- // #2109
- D=M
- //^^ push_d_to_stack
- // #2110
- @SP
- // #2111
- A=M
- // #2112
- M=D
- // #2113
- @SP
- // #2114
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(LCL, 2)
- //
- //// push argument 1
- //^^ push_from_ram(ARG, 1)
- // #2115
- @ARG
- // #2116
- D=M
- // #2117
- @1
- // #2118
- A=D+A
- // #2119
- D=M
- //^^ push_d_to_stack
- // #2120
- @SP
- // #2121
- A=M
- // #2122
- M=D
- // #2123
- @SP
- // #2124
- M=M+1
- //vv push_d_to_stack
- //vv push_from_ram(ARG, 1)
- //
- //// lt
- //^^ arith_cmp_op(JLT)
- //^^ pop_stack_to_d
- // #2125
- @SP
- // #2126
- M=M-1
- // #2127
- A=M
- // #2128
- D=M
- //vv pop_stack_to_d
- //^^ arith_d_with_stack_top(D-M)
- // #2129
- @R13
- // #2130
- M=D
- //^^ pop_stack_to_d
- // #2131
- @SP
- // #2132
- M=M-1
- // #2133
- A=M
- // #2134
- D=M
- //vv pop_stack_to_d
- // #2135
- @R13
- // #2136
- D=D-M
- // #21…
Large files files are truncated, but you can click here to view the full file