1 ; _____________________________________________ 2 ; | | 3 ; | Project: APPLER | 4 ; | File: DEBUG.ASM | 5 ; | Compiler: 16-bit TASM (2.5) | 6 ; | | 7 ; | Subject: Appler Debugger | 8 ; | | 9 ; | Author: Emil Dotchevski | 10 ; |_____________________________________________| 11 12 include GLOBALS.INC 13 include INTERFAC.INC 14 include CONIO.INC 15 include FM.INC 16 17 G_COMMAND_ENTRY = 00h 18 G_NewA = 01h 19 G_NewX = 02h 20 G_NewY = 03h 21 G_NewS = 04h 22 G_NewP = 05h 23 G_NewPC = 06h 24 G_Registers = 07h 25 G_MiniAsm = 08h 26 G_EditB = 09h 27 G_EditA = 0Ah 28 G_Disasm = 0Bh 29 G_DumpB = 0Ch 30 G_DumpA = 0Dh 31 G_Limits = 0Eh 32 G_Find = 0Fh 33 G_Copy = 10h 34 G_Compare = 11h 35 G_Breaks = 12h 36 G_Go = 13h 37 G_LoadLab = 14h 38 G_SaveLab = 15h 39 G_DefineLab = 16h 40 G_LabList = 17h 41 G_DelLab = 18h 42 G_LabOnOff = 19h 43 G_SwapOnOff = 1Ah 44 G_Calculate = 1Bh 45 G_ResetApple = 1Ch 46 G_MoveHelp = 1Dh 47 G_PrintDump = 1Eh 48 G_PrintAssembler = 1Fh 49 50 Debug segment public 51 assume DS:Apple,ES:Emulate,CS:Debug,SS:Data 52 53 GetLineBuf db 100 dup (0) 54 55 GetLineParams GL_ParamStruc 56 ScreenIOParams SIO_ParamStruc <1,Debug,0,0,offset Screen,seg Screen,1,0,1,1> 57 GetKeyParams RK_ParamStruc <1,GK_Fkey,1,Alt_Key,0,T_WaitKey,ShowAll,offset FirstMsg> 58 59 DebugOutInit proc far 60 cli 61 push ax ds es 62 mov ax,Apple 63 mov ds,ax 64 mov ax,Emulate 65 mov es,ax 66 mov al,ds:[0C000h] 67 mov es:[C000],al 68 call AppleKeysOn 69 call SetRegisters 70 pop es ds ax 71 ret 72 DebugOutInit endp 73 74 75 DebugInInit proc far 76 cli 77 push ax cx ds es 78 mov ax,Apple 79 mov ds,ax 80 mov ax,Emulate 81 mov es,ax 82 xor al,al 83 xchg al,es:C000 84 mov ds:[0C000h],al 85 call GetRegisters 86 assume ds:CONio 87 mov ax,CONio 88 mov ds,ax 89 mov GL_ParamsOfs, offset GetLineParams 90 mov GL_ParamsSeg, seg GetLineParams 91 mov SIO_ParamsOfs, offset ScreenIOParams 92 mov SIO_ParamsSeg, seg ScreenIOParams 93 mov RK_ParamsOfs, offset GetKeyParams 94 mov RK_ParamsSeg, seg GetKeyParams 95 call DebugKeysOn 96 call UnsetBreaks 97 cmp cs:ViewFlag,0 98 jz DII_Ret 99 mov ah,0Fh 100 int 10h 101 cmp al,3 102 jne DII_Ret 103 mov al,C050 104 ScreenIOservice _SetScreen 105 DII_Ret: pop es ds cx ax 106 sti 107 ret 108 DebugInInit endp 109 110 111 assume DS:Apple,ES:Emulate,CS:Debug 112 113 GoWhere? dw G_COMMAND_ENTRY 114 ShowAll? db 1 115 DebugMainRet: call DebugInit 116 BigLoop: mov ch,cs:GetLineParams.GL_BegPrint 117 mov cl,cs:GetLineParams.GL_Pos 118 mov di,cs:GoWhere? 119 shl di,1 120 mov cs:ShowAll?,1 121 mov cs:GoWhere?,G_COMMAND_ENTRY 122 push ds es 123 call cs:CmndAddress[di] 124 pop es ds 125 cmp cs:ShowAll?,0 126 jz BL_DontShowAll 127 mov cs:SM_Dec?,1 128 call ShowAll 129 mov cs:SM_Dec?,0 130 mov cs:GetLineParams.GL_Pos,cl 131 mov cs:GetLineParams.GL_BegPrint,ch 132 BL_DontShowAll: jmp BigLoop 133 134 CommandEntry: mov cs:GetLineParams.GL_Color,0Bh 135 mov cs:GetLineParams.GL_Error, offset UnknownCmd 136 mov cs:GetLineParams.GL_BegScan,offset MainCommands 137 mov cs:GetLineParams.GL_ENDScan,offset ENDScan1 138 mov cs:ActiveFlags,0000000000000001b 139 mov cs:ShowAllNumber,0 140 mov cs:GetLineParams.GL_GS_SpcFl,1 141 cmp cs:MinHelpPtr,8 142 je CE_01 143 mov ax,8 144 mov bx,42 145 call SH_Choose 146 CE_01: gotoxy 17,1 147 GetLineService _GETLINE 148 jc CE_Ret0 149 GetLineService _GetCommand 150 jc CommandEntry 151 inc di 152 mov cs:GoWhere?,di 153 mov cs:ShowAll?,0 154 jmp CE_Ret 155 CE_Ret0: GetLineService _GL_CLRBUFF 156 CE_Ret: ret 157 158 159 CmndAddress dw CommandEntry 160 dw NewA, NewX, NewY, NewS, NewP, NewPC, Registers 161 dw MiniAsm, EditB, EditA, Disasm, DumpB, DumpA 162 dw Limits, Find, Copy, Compare, Breaks, Go 163 dw LoadLab, SaveLab 164 dw DefineLab, LabList, DelLab, LabOnOff, SwapOnOff 165 dw Calculate, ResetApple, MoveHelp 166 dw PrintDump,PrintAssembler,SoundOnOff 167 dw RecordStart,RecordStop,RecordPlay 168 dw LoadRec, SaveRec 169 170 171 172 ; ******************************************************************* 173 ; ** ** 174 ; ** ** 175 ; ** COMMANDS ROUTINES ** 176 ; ** ** 177 ; ** ** 178 ; ******************************************************************* 179 180 181 ; -- Registers change commands --------- 182 183 NewA: mov di,0 184 jmp RegModify 185 NewX: mov di,1 186 jmp RegModify 187 NewY: mov di,2 188 jmp RegModify 189 NewS: mov di,3 190 jmp RegModify 191 NewP: mov di,4 192 jmp RegModify 193 NewPC: mov di,5 194 jmp RegModify 195 196 REG_StoreCX dw 0 197 REG_Current dw 0 198 REG_CurrentSVD dw 0 199 REG_CH db 3 200 REG_Subrt dw REG_Flags, REG_A, REG_X, REG_Y, REG_P, REG_S, REG_PC 201 202 Registers: mov cs:ScreenIOparams.CursorColor,40h 203 mov cs:ShowAllNumber,4 204 mov ax,77 205 mov bx,77 206 call SH_Choose 207 mov ax,cs:REG_CurrentSVD 208 mov cs:REG_Current,ax 209 mov ch,cs:REG_CH 210 mov cs:ActiveFlags,0000000000000100b 211 REG_Loop: mov bx,cs:REG_Current 212 shl bx,1 213 call cs:REG_Subrt[bx] 214 or al,al 215 jz REG_Loop 216 mov cs:REG_CH,ch 217 mov ax,cs:REG_Current 218 mov cs:REG_CurrentSVD,ax 219 GetLineService _GL_ClrBuff 220 ret 221 222 223 REG_A: lea bx,cs:Regs.A 224 clc 225 jmp RegsEdit 226 227 REG_X: lea bx,cs:Regs.X 228 clc 229 jmp RegsEdit 230 231 REG_Y: lea bx,cs:Regs.Y 232 clc 233 jmp RegsEdit 234 235 REG_P: lea bx,cs:Regs.P 236 clc 237 jmp RegsEdit 238 239 REG_S: lea bx,cs:Regs.S 240 clc 241 jmp RegsEdit 242 243 REG_PC: lea bx,cs:Regs.PC 244 stc 245 jmp RegsEdit 246 247 248 RF_Commands db 07h,08h,05h,06h,20h 249 db 18h,0Ch 250 RF_ComSubrt dw REG_Up, REG_Down, RF_Left,RF_Right,RF_Flip 251 dw REG_Enter,REG_Esc 252 RF_CL db 24h 253 RF_BL db 10000000b 254 REG_Flags: mov cl,cs:RF_CL 255 mov bl,cs:RF_BL 256 mov cs:ScreenIOparams.CursorLen,1 257 RF_Loop0: call ReadKey 258 push cx 259 mov di,offset RF_Commands 260 mov cx,offset RF_ComSubrt - offset RF_Commands 261 call CalcCommand 262 pop cx 263 jc RF_Loop0 264 shl di,1 265 call word ptr cs:RF_ComSubrt[di] 266 jnc RF_Loop0 267 mov cs:RF_BL,bl 268 mov cs:RF_CL,cl 269 ret 270 271 RF_Left: rol bl,1 272 dec cl 273 cmp cl,24h 274 jae RF_Lret 275 mov cl,2Bh 276 RF_Lret: clc 277 ret 278 279 RF_Right: ror bl,1 280 inc cl 281 cmp cl,2Bh 282 jbe RF_Rret 283 mov cl,24h 284 RF_Rret: clc 285 ret 286 287 RF_Flip: xor cs:Regs.P,bl 288 ret 289 290 291 292 RE_Commands db '0123456789abcdef' 293 db 07h,08h,18h,0Ch 294 RE_ComSubrt dw RE_Num,RE_Num,RE_Num,RE_Num,RE_Num,RE_Num,RE_Num,RE_Num 295 dw RE_Num,RE_Num,RE_Num,RE_Num,RE_Num,RE_Num,RE_Num,RE_Num 296 dw REG_Up, REG_Down,REG_Enter,REG_Esc 297 RE_FirstTime? db 1 298 RegsEdit: mov cs:ScreenIOparams.CursorLen,4 299 mov dl,0 300 jnc RE_ok0 301 inc dl 302 mov cs:ScreenIOparams.CursorLen,6 303 RE_ok0: mov cl,39 304 RE_Loop0: call ReadKey 305 push cx 306 mov di,offset RE_Commands 307 mov cx,offset RE_ComSubrt - offset RE_Commands 308 call CalcCommand 309 pop cx 310 jc RE_Loop0 311 shl di,1 312 call word ptr cs:RE_ComSubrt[di] 313 jnc RE_Loop0 314 ret 315 316 RE_Num: shr di,1 317 mov ax,di 318 or dl,dl 319 jnz RE_NumWord 320 cmp cs:RE_FirstTime?,0 321 jz RE_NumByte_1 322 mov byte ptr cs:[bx],0 323 RE_NumByte_1: shl byte ptr cs:[bx],4 324 or byte ptr cs:[bx],al 325 jmp RE_NumRet 326 RE_NumWord: call StopAnimate 327 cmp cs:RE_FirstTime?,0 328 jz RE_NumWord_1 329 mov word ptr cs:[bx],0 330 RE_NumWord_1: shl word ptr cs:[bx],4 331 or word ptr cs:[bx],ax 332 RE_NumRet: clc 333 mov cs:RE_FirstTime?,0 334 ret 335 336 337 338 REG_Up: dec cs:REG_Current 339 jns REG_UpRet 340 mov cs:REG_Current,6 341 REG_UpRet: mov ax,cs:REG_Current 342 mov ch,al 343 add ch,3 344 xor al,al 345 stc 346 mov cs:RE_FirstTime?,1 347 ret 348 349 REG_Enter: 350 REG_Down: inc cs:REG_Current 351 cmp cs:REG_Current,6 352 jbe REG_DownRet 353 mov cs:REG_Current,0 354 REG_DownRet: mov ax,cs:REG_Current 355 mov ch,al 356 add ch,3 357 xor al,al 358 stc 359 mov cs:RE_FirstTime?,1 360 ret 361 362 REG_Esc: mov cs:ScreenIOparams.CursorLen,1 363 mov al,0FFh 364 stc 365 mov cs:RE_FirstTime?,1 366 ret 367 368 369 370 371 R_StoreCX dw ? 372 RegModify: GetLineService _GL_GetSymb 373 or al,al 374 jz R_Error4 375 cmp al,'=' 376 jne R_Error3 377 mov cs:R_StoreCX,cx 378 call GetAddress 379 cmp di,5 380 jne R_2 381 mov cs:Regs.PC,ax 382 GetLineService _GL_ClrBuff 383 ret 384 R_2: cmp ah,0 385 jnz R_Error2 386 mov byte ptr cs:Regs.[di],al 387 GetLineService _GL_ClrBuff 388 ret 389 R_Error2: mov cs:GetKeyParams.RK_ErrPtr,offset IllegalNum 390 mov cx,cs:R_StoreCX 391 inc cl 392 ret 393 R_Error4: inc cl 394 R_Error3: mov cs:GetKeyParams.RK_ErrPtr,offset EqualMess 395 ret 396 397 398 399 400 ; -- Assembler ------------------------- 401 402 BuffDisasm: test cs:Mini_Flag,1 403 jz BD_ret 404 push cx si 405 mov cs:CalcFlag,0 406 mov si,cs:AssembAdr 407 GetLineService _GL_ClrBuff 408 mov cs:ScreenIOparams.SP_BufFlag,1 409 gotoxy 1Ah,2 ; Unvisible 410 call OneInstr 411 mov cs:ScreenIOparams.SP_BufFlag,0 412 mov cs:GetLineParams.GL_Pos,0 413 mov cs:GetLineParams.GL_BegPrint,0 414 pop si cx 415 BD_ret: ret 416 417 MA_StoreCX dw ? 418 MA_il db 3 dup (?) 419 MA_ad dw 3 dup (?) 420 MINI_Instr dw ? 421 Mini_Flag db 0 422 423 MiniAsm: GetLineService _GL_GetSymb 424 dec cl 425 or al,al 426 jz MINI111 427 call GetAddress 428 mov cs:AssembAdr,ax 429 MINI111: mov cs:GetLineParams.GL_MaxPrint,0Eh 430 mov cs:GetLineParams.GL_Color,1Bh 431 mov cs:GetLineParams.GL_Error,offset BadInstr 432 mov cs:GetLineParams.GL_BegScan,offset AsmInstr 433 mov cs:GetLineParams.GL_ENDScan,offset ENDScan2 434 call StopAnimate 435 mov cs:FkeysBuffer[1*size FkeyStruc].FkeyFlag,0 436 call ShowPrevIns 437 mov cs:ShowAllNumber,3 438 mov ax,52 439 mov bx,52 440 call SH_Choose 441 mov byte ptr cs:Mini_Flag,1 442 mov cs:ActiveFlags,0000000000000010b 443 444 MINI00: call BuffDisasm 445 MINI0001: gotoxy 4,11h 446 mov cs:ScreenIOParams.CursorLen,1 447 GetLineService _GetLine 448 jnc MINI0002 449 jmp MINIret 450 MINI0002: GetLineService _GetCommand 451 jc MINI0001 452 mov cs:MINI_instr,di 453 mov si,cs:AssembAdr 454 xor di,di 455 MINI000: mov al,[si] 456 xor bx,bx 457 mov bl,al 458 mov al,cs:InstrLongTbl[bx] 459 and al,00000011b 460 mov cs:MA_il[di],al 461 mov bx,di 462 shl bx,1 463 mov cs:MA_ad[bx],si 464 xor bx,bx 465 mov bl,al 466 add si,bx 467 inc di 468 cmp di,3 469 jb MINI000 470 471 call MA_Assemble 472 dec cl 473 mov cs:GetLineParams.GL_Pos,cl 474 mov cs:GetLineParams.GL_BegPrint,ch 475 jc MINI0001 476 477 xor di,di 478 xor ax,ax 479 sub bx,cs:AssembAdr 480 MINI_loop0: add al,cs:MA_il[di] 481 inc di 482 cmp bl,al 483 je MINI_ok1 484 ja MINI_loop0 485 xor ah,ah 486 mov bh,ah 487 sub ax,bx 488 shl di,1 489 mov bx,cs:MA_ad[di] 490 sub bx,ax 491 MINI_loop1: mov byte ptr [bx],0EAh 492 inc bx 493 dec ax 494 jnz MINI_Loop1 495 496 MINI_ok1: call DOWN 497 call ShowProgram 498 jmp MINI00 499 500 MINIret: call InitGetLine 501 mov byte ptr cs:Mini_Flag,0 502 mov cs:FkeysBuffer[1*size FkeyStruc].FkeyFlag,1 503 GetLineService _GL_ClrBuff 504 ret 505 506 MA_Assemble: mov dh,byte ptr cs:MINI_Instr 507 mov dl,12 508 mov al,dh 509 mul dl 510 mov bx,ax 511 xor dl,dl 512 mov cl,cs:GetLineParams.GL_Pos 513 mov ch,cs:GetLineParams.GL_BegPrint 514 mov cs:MA_StoreCX,cx 515 GetLineService _GL_GetSymb 516 or al,al 517 jz MA_OkAdrs 518 cmp al,'#' 519 je MA_Direct 520 cmp al,'(' 521 jne MA_Error1 522 jmp MA_Indirect 523 MA_Error1: dec cl 524 jmp MA_Full 525 526 MA_OkAdrs: mov dl,cs:AsmTab1[bx] 527 cmp dl,0FFh 528 je MA_Error0 529 mov bx,cs:AssembAdr 530 mov [bx],dl 531 inc bx 532 jmp MA_ret 533 534 MA_Error0: inc cl 535 MA_Error: mov cs:GetKeyParams.RK_ErrPtr,offset BadInstr 536 stc 537 ret 538 539 MA_ret: GetLineService _GL_ClrBuff 540 clc 541 ret 542 543 MA_Direct: mov dl,cs:AsmTab1[bx+1] 544 cmp dl,0FFh 545 je MA_Error0 546 GetLineService _GL_GetSymb 547 mov cs:MA_StoreCX,cx 548 dec cl 549 or al,al 550 jz MA_DirectE 551 mov cs:MA_StoreCX,cx 552 call GetAddress 553 cmp ah,0 554 jz MA_ok1122 555 MA_DirectE: mov cx,cs:MA_StoreCX 556 inc cl 557 jmp MA_Error 558 MA_ok1122: mov bx,cs:AssembAdr 559 mov [bx],dl 560 inc bx 561 mov [bx],al 562 inc bx 563 jmp MA_Ret 564 565 MA_Full: mov cx,cs:MA_StoreCX 566 GetLineService _GL_GetSymb 567 or al,al 568 jz MA_Error0 569 dec cl 570 call GetAddress 571 dec cl 572 cmp dh,35 573 jb MA_ESD1 574 cmp dh,44 575 jnb MA_ESD1 576 jmp MA_Branches 577 MA_ESD1: push ax 578 GetLineService _GL_GetSymb 579 cmp al,',' 580 jne MA_RealyFul 581 GetLineService _GL_GetSymb 582 or al,20h 583 cmp al,'x' 584 je MA_FullX 585 cmp al,'y' 586 pop ax 587 jne MA_QWERTY 588 jmp MA_FullY 589 MA_QWERTY: jmp MA_Error 590 591 MA_RealyFul: pop ax 592 cmp ah,0 593 jz MA_TryZP 594 MA_NoZP: mov dl,cs:AsmTab1[bx+5] 595 cmp dl,0FFh 596 jne MA_FullOK1 597 mov cx,cs:MA_StoreCX 598 jmp MA_Error0 599 MA_FullOK1: mov bx,cs:AssembAdr 600 mov [bx],dl 601 inc bx 602 mov [bx],ax 603 inc bx 604 inc bx 605 jmp MA_ret 606 607 MA_TryZP: mov dl,cs:AsmTab1[bx+2] 608 cmp dl,0FFh 609 je MA_NoZP 610 mov bx,cs:AssembAdr 611 mov [bx],dl 612 inc bx 613 mov [bx],al 614 inc bx 615 jmp MA_ret 616 617 MA_FullX: pop ax 618 cmp ah,0 619 jz MA_TryZP1 620 MA_NoZP1: mov dl,cs:AsmTab1[bx+6] 621 cmp dl,0FFh 622 jne MA_FullOK2 623 mov cx,cs:MA_StoreCX 624 jmp MA_Error0 625 MA_FullOK2: mov bx,cs:AssembAdr 626 mov [bx],dl 627 inc bx 628 mov [bx],ax 629 inc bx 630 inc bx 631 jmp MA_ret 632 633 MA_TryZP1: mov dl,cs:AsmTab1[bx+3] 634 cmp dl,0FFh 635 je MA_NoZP1 636 mov bx,cs:AssembAdr 637 mov [bx],dl 638 inc bx 639 mov [bx],al 640 inc bx 641 jmp MA_ret 642 643 MA_FullY: cmp ah,0 644 jz MA_TryZP2 645 MA_NoZP2: mov dl,cs:AsmTab1[bx+7] 646 cmp dl,0FFh 647 jne MA_FullOK3 648 mov cx,cs:MA_StoreCX 649 jmp MA_Error0 650 MA_FullOK3: mov bx,cs:AssembAdr 651 mov [bx],dl 652 inc bx 653 mov [bx],ax 654 inc bx 655 inc bx 656 jmp MA_ret 657 658 MA_TryZP2: mov dl,cs:AsmTab1[bx+4] 659 cmp dl,0FFh 660 je MA_NoZP2 661 mov bx,cs:AssembAdr 662 mov [bx],dl 663 inc bx 664 mov [bx],al 665 inc bx 666 jmp MA_ret 667 668 669 MA_Indirect: mov cs:MA_StoreCX,cx 670 GetLineService _GL_GetSymb 671 mov cx,cs:MA_StoreCX 672 or al,al 673 jnz MA_IndOK33 674 jmp MA_Error 675 MA_IndOK33: cmp dh,44 676 jne MA_NoIndJmp 677 jmp MA_IndJMP 678 MA_NoIndJmp: mov cs:MA_StoreCX,cx 679 call GetAddress 680 dec cl 681 push ax 682 GetLineService _GL_GetSymb 683 or al,al 684 jnz MA_IndOK2 685 pop ax 686 jmp MA_Error 687 MA_IndOK2: cmp al,')' 688 je MA_IndY 689 cmp al,',' 690 je MA_IndX 691 pop ax 692 mov cx,cs:MA_StoreCX 693 jmp MA_Error 694 695 MA_IndY: GetLineService _GL_GetSymb 696 or al,al 697 jz MA_65C02_ind 698 cmp al,',' 699 je MA_IndY1 700 pop ax 701 jmp MA_Error 702 MA_IndY1: GetLineService _GL_GetSymb 703 or al,20h 704 cmp al,'y' 705 je MA_IndY2 706 pop ax 707 jmp MA_Error 708 MA_IndY2: pop ax 709 cmp ah,0 710 jz MA_IndY21 711 MA_65C02_indER: mov cx,cs:MA_StoreCX 712 inc cl 713 jmp MA_Error 714 MA_IndY21: mov dl,cs:AsmTab1[bx+9] 715 MA_65C02_indOK: cmp dl,0FFh 716 jne MA_IndY3 717 mov cx,cs:MA_StoreCX 718 jmp MA_Error0 719 MA_IndY3: mov bx,cs:AssembAdr 720 mov [bx],dl 721 inc bx 722 mov [bx],al 723 inc bx 724 jmp MA_ret 725 MA_65C02_ind: pop ax 726 cmp ah,0 727 jnz MA_65C02_indER 728 mov dl,cs:AsmTab1[bx+10] 729 jmp MA_65C02_indOK 730 731 732 MA_IndX: GetLineService _GL_GetSymb 733 or al,20h 734 cmp al,'x' 735 je MA_IndX2 736 pop ax 737 jmp MA_Error 738 MA_IndX2: pop ax 739 cmp ah,0 740 jz MA_IndX21 741 mov cx,cs:MA_StoreCX 742 inc cl 743 jmp MA_Error 744 MA_IndX21: mov dl,cs:AsmTab1[bx+8] 745 cmp dl,0FFh 746 jne MA_IndX3 747 mov cx,cs:MA_StoreCX 748 jmp MA_Error0 749 MA_IndX3: mov bx,cs:AssembAdr 750 mov [bx],dl 751 inc bx 752 mov [bx],al 753 inc bx 754 jmp MA_ret 755 756 MA_IndJMP: call GetAddress 757 mov bx,cs:AssembAdr 758 mov dl,6Ch 759 push ax 760 dec cl 761 GetLineService _GL_GETSYMB 762 cmp al,')' 763 jz MA_IndJMP6C 764 cmp al,',' 765 jne MA_IndJMP_ER 766 GetLineService _GL_GETSYMB 767 or al,20h 768 cmp al,'x' 769 jne MA_IndJMP_ER 770 mov dl,7Ch 771 MA_IndJMP6C: pop ax 772 mov [bx],dl 773 inc bx 774 mov [bx],ax 775 inc bx 776 inc bx 777 jmp MA_ret 778 MA_IndJMP_ER: dec cl 779 MA_IndJMP_ER1: pop ax 780 jmp MA_Error0 781 782 783 MA_Branches: push bx 784 mov bx,cs:AssembAdr 785 add bx,2 786 sub ax,bx 787 rcl dh,1 788 ror dh,1 789 adc ah,0 790 jnz MA_err 791 xor dh,al 792 shl dh,1 793 jnc MA_noerr 794 MA_err: pop bx 795 mov cx,cs:MA_StoreCX 796 inc cl 797 inc cl 798 jmp MA_Error 799 MA_noerr: pop bx 800 mov dl,cs:AsmTab1[bx+5] 801 mov bx,cs:AssembAdr 802 mov [bx],dl 803 inc bx 804 mov [bx],al 805 inc bx 806 jmp MA_ret 807 808 809 BufferA db 64 dup (?) 810 InitBufferA: push cx si di es 811 mov si,cs 812 mov es,si 813 mov si,SDA_Address 814 mov di,offset BufferA 815 mov cx,64 816 cld 817 rep movsb 818 pop es di si cx 819 ret 820 821 822 BufferB db 64 dup (?) 823 InitBufferB: push cx si di es 824 mov si,cs 825 mov es,si 826 mov si,SDB_Address 827 mov di,offset BufferB 828 mov cx,64 829 cld 830 rep movsb 831 pop es di si cx 832 ret 833 834 835 836 ; -- Memory Edit B --------------------- 837 838 MemoryEditStruc struc 839 EB_TextOrHex db ? 840 EB_TextCL2 db ? 841 EB_TextCL1 db ? 842 EB_TextCH db ? 843 EB_FirstFl db ? 844 EB_Address dw ? 845 EB_MinUp db ? 846 EB_MaxDown db ? 847 EB_MinLeft1 db ? 848 EB_MinLeft2 db ? 849 EB_MaxRight1 db ? 850 EB_MaxRight2 db ? 851 EB_Center db ? 852 EB_BytesInLine dw ? 853 EB_MemAdr dw ? 854 EB_InitBuffProc dw ? 855 EB_TabFlag db ? 856 MemoryEditStruc ends 857 858 EB_Flag db 0 859 EB_Params MemoryEditStruc <0,8,61,20,0,0,20,23,8,61,54,77,29,16,offset SDB_Address,InitBufferB,1> 860 EditB: mov cs:EB_ParamsAddr, offset EB_Params 861 mov cs:ActiveFlags,0000000001000000b 862 mov cs:ShowAllNumber,2 863 mov ax,68 864 mov bx,68 865 call SH_Choose 866 mov cs:EB_Flag,1 867 call MemoryEditor 868 mov cs:EB_Flag,0 869 ret 870 871 872 873 874 ; -- Memory Edit A --------------------- 875 876 EA_Params MemoryEditStruc <0,54,0,9,0,0,9,16,54,0,75,0FFh,0FFh,8,offset SDA_Address,InitBufferA,0> 877 EditA: mov cs:EB_ParamsAddr, offset EA_Params 878 mov cs:ActiveFlags,0000000000100000b 879 mov cs:ShowAllNumber,1 880 mov ax,61 881 mov bx,61 882 call SH_Choose 883 mov cs:EB_Flag,0 884 call MemoryEditor 885 mov cs:EB_Flag,1 886 ret 887 888 889 890 891 ; -- Disassembler ---------------------- 892 893 Disasm: call GetAddress 894 call StopAnimate 895 mov cs:AssembAdr,ax 896 call ShowPrevIns 897 GetLineService _GL_ClrBuff 898 ret 899 900 901 902 903 ; -- Dump B ---------------------------- 904 905 DumpB: call GetAddress 906 mov cs:SDB_Address,ax 907 call InitBufferB 908 mov si,offset EB_Params 909 call EB_Init 910 GetLineService _GL_ClrBuff 911 ret 912 913 914 915 916 ; -- Dump A ---------------------------- 917 918 DumpA: call GetAddress 919 mov cs:SDA_Address,ax 920 call InitBufferA 921 mov si,offset EA_Params 922 call EB_Init 923 GetLineService _GL_ClrBuff 924 ret 925 926 927 928 929 ; -- Limits ---------------------------- 930 931 LeftLimit dw 0 ; '[' command 932 RightLimit dw 0BFFFh 933 934 Limits: GetLineService _GL_GetSymb 935 or al,al 936 jnz LI_ok1 937 GetLineService _GL_ClrBuff 938 mov al,'[' 939 GetLineService _GL_Symbol 940 mov al,' ' 941 GetLineService _GL_Symbol 942 mov al,byte ptr cs:LeftLimit[1] 943 GetLineService _GL_Byte 944 mov al,byte ptr cs:LeftLimit 945 GetLineService _GL_Byte 946 mov al,',' 947 GetLineService _GL_Symbol 948 mov al,byte ptr cs:RightLimit[1] 949 GetLineService _GL_Byte 950 mov al,byte ptr cs:RightLimit 951 GetLineService _GL_Byte 952 mov al,']' 953 GetLineService _GL_Symbol 954 mov cl,cs:GetLineParams.GL_Pos 955 mov ch,cs:GetLineParams.GL_BegPrint 956 ret 957 958 LI_ok1: cmp al,']' 959 je LI_End 960 cmp al,',' 961 je LI_Second 962 dec cl 963 call GetAddress 964 mov cs:LeftLimit,ax 965 LI_Second: GetLineService _GL_GetSymb 966 or al,al 967 jz LI_End 968 cmp al,']' 969 je LI_End 970 dec cl 971 call GetAddress 972 mov cs:RightLimit,ax 973 LI_End: mov ax,cs:LeftLimit 974 cmp ax,cs:RightLimit 975 ja LI_NoOk 976 GetLineService _GL_ClrBuff 977 ret 978 LI_NoOk: mov cs:GetKeyParams.RK_ErrPtr,offset AdressError 979 inc cl 980 ret 981 982 983 984 985 ; -- Find ------------------------------ 986 987 FindBuffer db 256 dup (0) 988 F_LastAdr dw 0 989 F_BufPtr db 0 990 TextFlag db 0 991 F_StoreCX dw 0 992 F_StoreCX1 dw 0 993 F_StoreCX2 dw 0 994 F_or db 0 995 F_si dw 0 996 997 F_Err1: mov cs:GetKeyParams.RK_ErrPtr,offset NoStringMes 998 inc cl 999 ret 1000 1001 F_Err2: mov cs:GetKeyParams.RK_ErrPtr,offset ByteExpMes 1002 mov cx,cs:F_StoreCX2 1003 mov cs:F_BufPtr,0 1004 inc cl 1005 ret 1006 1007 Find: mov dl,cs:GetLineParams.GL_GS_SpcFl ; 'F' command 1008 GetLineService _GL_GetSymb 1009 cmp cs:F_BufPtr,0 1010 jnz F_FindNext 1011 or al,al 1012 jz F_Err1 1013 F_FindNext: or al,al 1014 jnz F_New 1015 mov si,cs:F_LastAdr 1016 inc si 1017 mov cs:F_si,si 1018 jmp F_Go_0 1019 F_New: dec cl 1020 xor ax,ax 1021 mov cs:TextFlag,al 1022 mov cs:F_BufPtr,al 1023 mov cs:F_or,al 1024 F_0: GetLineService _GL_GetSymb 1025 or al,al 1026 jnz F_0000 1027 jmp f_Go 1028 F_0000: cmp al,27h ; ' 1029 jne F_str_0 1030 mov byte ptr cs:F_or,0 1031 jmp F_str 1032 F_Str_0: cmp al,'"' 1033 jne F_1 1034 mov byte ptr cs:F_or,80h 1035 F_str: xor byte ptr cs:TextFlag,0FFh 1036 mov byte ptr cs:GetLineParams.GL_GS_SpcFl,0 1037 jnz F_0 1038 mov byte ptr cs:GetLineParams.GL_GS_SpcFl,1 1039 GetLineService _GL_GetSymb 1040 cmp al,',' 1041 je F_0 1042 dec cl 1043 jmp F_0 1044 1045 F_1: cmp byte ptr cs:TextFlag,0 1046 jnz F_1_1 1047 dec cl 1048 mov cs:F_StoreCX2,cx 1049 call GetAddress 1050 or ah,ah 1051 jz F_1_1_1 1052 jmp F_Err2 1053 F_1_1: or al,cs:F_or 1054 F_1_1_1: xor bx,bx 1055 mov bl,cs:F_BufPtr 1056 mov cs:FindBuffer[bx],al 1057 inc byte ptr cs:F_BufPtr 1058 jmp F_0 1059 1060 F_Go: mov si,cs:LeftLimit 1061 mov cs:F_si,si 1062 F_Go_0: push cs 1063 pop es 1064 jmp F_Go_000 1065 F_Go_00: inc word ptr cs:F_si 1066 jz F_NotFound 1067 F_Go_000: mov si,cs:F_si 1068 cmp si,cs:RightLimit 1069 ja F_NotFound 1070 mov di,offset FindBuffer 1071 xor cx,cx 1072 mov cl,cs:F_BufPtr 1073 rep cmpsb 1074 jne F_Go_00 1075 mov si,cs:F_si 1076 mov cs:SDB_Address,si 1077 call InitBufferB 1078 mov cs:F_LastAdr,si 1079 mov si,offset EB_Params 1080 call EB_Init 1081 mov cs:GetLineParams.GL_GS_SpcFl,dl 1082 GetLineService _GL_ClrBuff 1083 jmp F_ret 1084 F_NotFound: mov cs:GetKeyParams.RK_ErrPtr,offset NotFound 1085 mov cs:GetLineParams.GL_GS_SpcFl,dl 1086 mov cl,cs:GetLineParams.GL_Pos 1087 mov ch,cs:GetLineParams.GL_BegPrint 1088 inc cl 1089 F_ret: ret 1090 1091 1092 1093 1094 ; -- Copy ------------------------------ 1095 1096 Copy: call GetAddress 1097 push ax 1098 GetLineService _GL_GetSymb 1099 or al,al 1100 jnz C_1 1101 pop ax 1102 push ax 1103 cmp ax,cs:LeftLimit 1104 jb C_Forward 1105 stc 1106 jmp C_01 1107 C_Forward: clc 1108 jmp C_01 1109 C_1: call Upcase 1110 cmp al,'f' 1111 clc 1112 je C_01 1113 cmp al,'b' 1114 jne C_Error 1115 stc 1116 C_01: pop ax 1117 push es 1118 push ds 1119 pop es 1120 pushf 1121 mov di,ax 1122 mov si,cs:LeftLimit 1123 mov cx,cs:RightLimit 1124 sub cx,si 1125 inc cx 1126 popf 1127 cld 1128 jnc C_DoCopy 1129 mov si,cs:RightLimit 1130 add di,cx 1131 dec di 1132 std 1133 C_DoCopy: rep movsb 1134 pop es 1135 cld 1136 GetLineService _GL_ClrBuff 1137 ret 1138 C_Error: pop ax 1139 GetLineService _GL_Left 1140 mov cs:GetKeyParams.RK_ErrPtr,offset BadParam 1141 ret 1142 1143 1144 1145 1146 ; -- Compare --------------------------- 1147 1148 Compare: call GetAddress 1149 push es 1150 push ds 1151 pop es 1152 mov di,ax 1153 mov si,cs:LeftLimit 1154 mov cx,cs:RightLimit 1155 sub cx,si 1156 inc cx 1157 cld 1158 repe cmpsb 1159 pop es 1160 pushf 1161 GetLineService _GL_ClrBuff 1162 inc cl 1163 popf 1164 mov cs:GetKeyParams.RK_ErrPtr,offset Identifical 1165 je O_Ident 1166 mov cs:GetKeyParams.RK_ErrPtr,offset NotIdent 1167 dec di 1168 mov cs:SDB_Address,di 1169 call InitBufferB 1170 mov si,offset EB_Params 1171 call EB_Init 1172 O_Ident: ret 1173 1174 1175 1176 1177 ; -- Breaks ---------------------------- 1178 1179 Breaks: GetLineService _GL_GetSymb ; 'B' command 1180 or al,al 1181 jnz B_ok1 1182 B_Err: inc cl 1183 B_Err1: mov cs:GetKeyParams.RK_ErrPtr,offset BreakNumMES 1184 ret 1185 B_ok1: dec cl 1186 GetLineService _GL_GetSymb 1187 sub al,'0' 1188 cmp al,6 1189 ja B_Err1 1190 cmp al,1 1191 jb B_Err1 1192 mov bl,7 1193 mul bl 1194 mov bx,ax 1195 GetLineService _GL_GetSymb 1196 or al,al 1197 jnz B_ok2 1198 xor cs:Breakpoints.[bx].BP_ActiveFlag,1 1199 GetLineService _GL_ClrBuff 1200 ret 1201 B_ok2: cmp al,'=' 1202 je B_ok3 1203 mov cs:GetKeyParams.RK_ErrPtr,offset EqualMess 1204 ret 1205 B_ok3: call GetAddress 1206 mov cs:Breakpoints[bx].BP_ActiveFlag,1 1207 mov cs:Breakpoints[bx].BP_Address,ax 1208 GetLineService _GL_ClrBuff 1209 ret 1210 1211 1212 1213 1214 ; -- Go -------------------------------- 1215 1216 Go: mov bx,cs:AssembAdr ; 'G' command 1217 GetLineService _GL_GetSymb 1218 or al,al 1219 jz GO_1 1220 cmp al,',' 1221 je Go_SecAdr 1222 dec cl 1223 call GetAddress 1224 mov bx,ax 1225 dec cl 1226 GetLineService _GL_GetSymb 1227 or al,al 1228 jz GO_1 1229 cmp al,',' 1230 jne GO_1 1231 Go_SecAdr: mov cs:Regs.PC,bx 1232 call GetAddress 1233 mov cs:Breakpoints.BP_ActiveFlag,1 1234 mov cs:Breakpoints.BP_Address,ax 1235 call GoAppleII 1236 mov cs:Breakpoints.BP_ActiveFlag,0 1237 GetLineService _GL_ClrBuff 1238 ret 1239 GO_1: mov cs:Regs.PC,bx 1240 mov cs:Breakpoints.BP_ActiveFlag,0 1241 call GoAppleII0 1242 GetLineService _GL_ClrBuff 1243 ret 1244 1245 1246 1247 1248 ; -- Load Labels ----------------------- 1249 1250 LoadLab: GetLineService _GL_GetSymb ; 'LL' command 1251 dec cl 1252 or al,al 1253 jnz LL_E0 1254 GetLineService _GL_ClrBuff 1255 mov bx,offset Com_LLabels 1256 GetLineService _GL_String 1257 mov al,' ' 1258 GetLineService _GL_Symbol 1259 mov bx,offset LAB_FileSpec 1260 GetLineService _GL_String 1261 GetLineService _GL_Home 1262 xor ch,ch 1263 mov cl,4 1264 mov cs:GetKeyParams.RK_ErrPtr,offset LS_EnterMes1 1265 ret 1266 LL_E0: mov byte ptr cs:LS_OpenFileF,3Dh 1267 mov byte ptr cs:LS_RWfileF,3Fh 1268 mov word ptr cs:LS_ErrPtr,offset LabErrMes_L 1269 mov word ptr cs:LS_OkPtr,offset LabMes_L 1270 mov word ptr cs:LS_FileSpec,offset LAB_FileSpec 1271 mov word ptr cs:LS_Ext,offset LAB_Ext 1272 mov word ptr cs:LS_Buffer,offset SymbMem 1273 mov word ptr cs:LS_BufferLen,MaxSymbMem * 2 + 4 1274 jmp File_LS 1275 1276 1277 1278 1279 ; -- Save Labels ----------------------- 1280 1281 LAB_FileSpec db 'UNTITLED.LAB', 67 dup (0) 1282 LAB_Ext db '.LAB',0 1283 SL_ErrFuck: mov cs:GetKeyParams.RK_ErrPtr,offset SymNoSymbErr 1284 GetLineService _GL_End 1285 mov cl,cs:GetLineParams.GL_Pos 1286 mov ch,cs:GetLineParams.GL_BegPrint 1287 inc cl 1288 ret 1289 SaveLab: cmp cs:SymbPtr,0 ; 'SL' command 1290 jz SL_ErrFuck 1291 GetLineService _GL_GetSymb 1292 dec cl 1293 or al,al 1294 jnz SL_E0 1295 GetLineService _GL_ClrBuff 1296 mov bx,offset Com_SLabels 1297 GetLineService _GL_String 1298 mov al,' ' 1299 GetLineService _GL_Symbol 1300 mov bx,offset LAB_FileSpec 1301 GetLineService _GL_String 1302 GetLineService _GL_Home 1303 xor ch,ch 1304 mov cl,4 1305 mov cs:GetKeyParams.RK_ErrPtr,offset LS_EnterMes2 1306 ret 1307 SL_E0: mov byte ptr cs:LS_OpenFileF,3Ch 1308 mov byte ptr cs:LS_RWfileF,40h 1309 mov word ptr cs:LS_ErrPtr,offset LabErrMes_S 1310 mov word ptr cs:LS_OkPtr,offset LabMes_S 1311 mov word ptr cs:LS_FileSpec,offset LAB_FileSpec 1312 mov word ptr cs:LS_Ext,offset LAB_Ext 1313 mov word ptr cs:LS_Buffer,offset SymbMem 1314 mov word ptr cs:LS_BufferLen,MaxSymbMem * 2 + 4 1315 jmp File_LS 1316 1317 1318 1319 1320 ; -- Define Label ---------------------- 1321 1322 MaxSymbMem = 1000h 1323 MaxValCount = MaxSymbMem / 2 1324 1325 even ; Don't touch! 1326 SymbMem db MaxSymbMem dup (0) 1327 SymbPtr dw 0 1328 SymbVal dw MaxValCount dup (0) 1329 SymbValPtr dw 0 1330 1331 DefineLab: call SymbGetVal 1332 jc SD_NewSymb 1333 mov bx,cs:SGV_adr 1334 mov cx,cs:SGV_cx 1335 GetLineService _GL_GetSymb 1336 or al,al 1337 jz SD_EqMiss 1338 cmp al,'=' 1339 jne SD_EqMiss1 1340 call GetAddress 1341 mov cs:SymbVal[bx],ax 1342 jmp SD_ret 1343 SD_NewSymb: GetLineService _GL_GetSymb 1344 or al,al 1345 jz SD_SymMiss 1346 push cx 1347 mov di,offset Delimiters 1348 mov cx,Delimiters_C 1349 call CalcCommand 1350 pop cx 1351 jnc SD_SymMiss1 1352 dec cl 1353 mov bx,cs:SymbPtr 1354 SD_Loop0: GetLineService _GL_GetSymb 1355 cmp al,'=' 1356 je SD_Cont1 1357 or al,al 1358 jz SD_EqMiss 1359 push cx 1360 mov di,offset Delimiters 1361 mov cx,Delimiters_C 1362 call CalcCommand 1363 pop cx 1364 jnc SD_EqMiss1 1365 mov cs:SymbMem[bx],al 1366 inc bx 1367 cmp bx,MaxSymbMem 1368 jb SD_Loop0 1369 mov cs:GetKeyParams.RK_ErrPtr,offset SymNoMemErr 1370 ret 1371 SD_EqMiss: inc cl 1372 SD_EqMiss1: mov cs:GetKeyParams.RK_ErrPtr,offset EqualMess 1373 ret 1374 SD_SymMiss: inc cl 1375 SD_SymMiss1: mov cs:GetKeyParams.RK_ErrPtr,offset SymMissErr 1376 ret 1377 SD_Cont1: call GetAddress 1378 mov word ptr cs:SymbMem[bx],0 1379 inc bx 1380 mov cs:SymbPtr,bx 1381 mov si,cs:SymbValPtr 1382 shl si,1 1383 mov cs:SymbVal[si],ax 1384 inc word ptr cs:SymbValPtr 1385 SD_ret: mov cs:GetKeyParams.RK_ErrPtr,0 1386 call ShowPrevIns 1387 GetLineService _GL_ClrBuff 1388 ret 1389 1390 1391 1392 1393 ; -- Labels List ----------------------- 1394 1395 LL_Commands db 7,8,3,4,0Ch,18h 1396 LL_Procs dw LL_Up,LL_Down,LL_PgUp,LL_PgDn,LL_Esc,LL_Enter 1397 LabList: cmp cs:SymbPtr,0 ; 'list' command 1398 jnz LL_NoError 1399 jmp LL_Error1 1400 LL_NoError: mov ax,85 1401 mov bx,85 1402 call SH_Choose 1403 mov cs:SL_Flag,1 1404 mov cs:ShowAllNumber,6 1405 mov cs:ActiveFlags,0000000100000000b 1406 mov cs:SL_Ptr,0 1407 LL_Loop: call ReadKey 1408 mov cx,offset LL_Procs- offset LL_Commands 1409 mov di,offset LL_Commands 1410 call CalcCommand 1411 jc LL_Loop 1412 shl di,1 1413 call cs:LL_Procs[di] 1414 jnc LL_Loop 1415 LL_Ret: mov cs:SL_Flag,0 1416 GetLineService _GL_ClrBuff 1417 ret 1418 1419 LL_Up: cmp cs:SL_Ptr,0 1420 jz LL_UpRet 1421 dec cs:SL_Ptr 1422 LL_UpRet: clc 1423 ret 1424 1425 LL_Down: mov ax,cs:SL_Ptr 1426 add ax,10 1427 cmp ax,cs:SymbValPtr 1428 jae LL_DownRet 1429 inc cs:SL_Ptr 1430 LL_DownRet: clc 1431 ret 1432 1433 LL_PgUp: mov di,10 1434 LL_PgUpLoop: call LL_Up 1435 dec di 1436 jnz LL_PgUpLoop 1437 clc 1438 ret 1439 1440 LL_PgDn: mov di,10 1441 LL_PgDnLoop: call LL_Down 1442 dec di 1443 jnz LL_PgDnLoop 1444 clc 1445 ret 1446 1447 LL_Esc: 1448 LL_Enter: stc 1449 ret 1450 1451 LL_Error1: mov cs:GetKeyParams.RK_ErrPtr,offset SymNoSymbErr 1452 inc cl 1453 ret 1454 1455 1456 1457 ; -- Delete Label ---------------------- 1458 1459 SD_Error1: mov cs:GetKeyParams.RK_ErrPtr,offset SymMissErr 1460 SD_Error2: inc cl 1461 ret 1462 1463 DelLab: GetLineService _GL_GetSymb 1464 or al,al 1465 jz SD_Error1 1466 cmp al,'.' 1467 je SDel_1 1468 dec cl 1469 SDel_1: call SymbGetVal 1470 jc SD_Error2 1471 mov si,offset SymbMem 1472 mov di,si 1473 add si,cs:SGV_nameEnd 1474 add di,cs:SGV_nameBeg 1475 inc si 1476 push ds 1477 mov ax,cs 1478 mov ds,ax 1479 mov es,ax 1480 mov cx,cs:SymbPtr 1481 sub cx,cs:SGV_nameEnd 1482 inc cx 1483 cld 1484 rep movsb 1485 mov si,offset SymbVal 1486 add si,cs:SGV_adr 1487 mov di,si 1488 add si,2 1489 mov cx,cs:SymbValPtr 1490 shl cx,1 1491 sub cx,cs:SGV_adr 1492 dec cx 1493 rep movsb 1494 pop ds 1495 dec word ptr cs:SymbValPtr 1496 mov cx,cs:SGV_nameEnd 1497 sub cx,cs:SGV_nameBeg 1498 inc cx 1499 sub cs:SymbPtr,cx 1500 mov bx,cs:SymbPtr 1501 mov word ptr cs:SymbMem[bx],0 1502 call ShowPrevIns 1503 GetLineService _GL_ClrBuff 1504 SDel_ret: ret 1505 1506 1507 1508 1509 ; -- Labels ON/OFF --------------------- 1510 1511 LabOnOff: call OnOff 1512 jc LOO_ret 1513 mov byte ptr cs:WordPrintFl,1 1514 jnz LOO_ret0 1515 mov byte ptr cs:WordPrintFl,0 1516 LOO_ret0: call ShowPrevIns 1517 GetLineService _GL_ClrBuff 1518 LOO_ret: ret 1519 1520 1521 1522 1523 ; -- Swap ON/OFF ----------------------- 1524 1525 SwapOnOff: call GetAddress 1526 mov cs:SwapTime,ax 1527 GetLineService _GL_ClrBuff 1528 ret 1529 1530 1531 1532 1533 ; -- Evaluate expression --------------- 1534 1535 CalcCom db 'h$d@b%' 1536 CalcSub dw CalcHex,CalcHex,CalcHex,CalcDec,CalcDec,CalcBin,CalcBin 1537 CalcNum dw ? 1538 1539 Calculate: call GetAddress 1540 mov cs:CalcNum,ax 1541 GetLineService _GL_GetSymb 1542 or al,al 1543 mov di,0 1544 jz CalcOk1 1545 push cx 1546 mov di,offset CalcCom 1547 mov cx,offset CalcSub - offset CalcCom 1548 call CalcCommand 1549 pop cx 1550 jc CalcError 1551 inc di 1552 shl di,1 1553 CalcOk1: mov bx,cs:CalcNum 1554 GetLineService _GL_ClrBuff 1555 mov al,' ' 1556 GetLineService _GL_Symbol 1557 mov GetLineParams.GL_InsFlag,1 1558 call word ptr cs:CalcSub[di] 1559 xor cx,cx 1560 cmp cs:GetKeyParams.RK_ErrPtr,cx 1561 jz CalcRet 1562 inc cl 1563 CalcRet: ret 1564 CalcError: mov cs:GetKeyParams.RK_ErrPtr,offset BadParam 1565 ret 1566 1567 CalcHex: mov al,bh 1568 GetLineService _GL_Byte 1569 mov al,bl 1570 GetLineService _GL_Byte 1571 ret 1572 1573 CalcBin: mov al,'%' 1574 GetLineService _GL_Symbol 1575 mov dx,1 1576 or bx,bx 1577 clc 1578 jz CalcB1 1579 mov dx,10h 1580 CalcB0: dec dx 1581 shl bx,1 1582 jnc CalcB0 1583 inc dx 1584 jmp CalcB1 1585 CalcBinLoop: shl bx,1 1586 CalcB1: mov al,'0' 1587 jnc CalcB2 1588 mov al,'1' 1589 CalcB2: GetLineService _GL_Symbol 1590 dec dx 1591 jnz CalcBinLoop 1592 CalcB3: ret 1593 1594 CalcDec: mov al,'@' 1595 GetLineService _GL_Symbol 1596 or bx,bx 1597 jz CalcD0000 1598 CalcDdiv: xor dx,dx 1599 CalcD0: inc dx 1600 sub bx,10 1601 jnc CalcD0 1602 add bx,10 1603 dec dx 1604 mov ax,bx 1605 mov bx,dx 1606 add ax,'0' 1607 GetLineService _GL_Symbol 1608 GetLineService _GL_Left 1609 cmp dx,0 1610 jnz CalcDdiv 1611 ret 1612 CalcD0000: mov al,'0' 1613 GetLineService _GL_Symbol 1614 ret 1615 1616 1617 1618 1619 ; -- Cold RESET Apple ][ --------------- 1620 1621 ResetApple: call ResetAppleII 1622 mov ax,ds:[0FFFCh] 1623 mov cs:Regs.PC,ax 1624 mov cs:AssembAdr,ax 1625 call StopAnimate 1626 call ShowPrevIns 1627 xor al,al 1628 mov cs:Regs.A,al 1629 mov cs:Regs.X,al 1630 mov cs:Regs.Y,al 1631 mov cs:Regs.S,al 1632 mov cs:Regs.P,20h 1633 GetLineService _GL_ClrBuff 1634 ret 1635 1636 1637 1638 1639 ; -- Move Help Window ------------------ 1640 1641 MH_Keys db 7,8,5,6,1,2,3,4,19h,0Ch,18h 1642 MH_Subrt dw MH_Up,MH_Down,MH_Left,MH_Right 1643 dw MH_Home,MH_End,MH_PgUp,MH_PgDn,MH_Cntr 1644 dw MH_Esc,MH_Enter 1645 MH_CX dw ? 1646 MH_OldSH_CX dw ? 1647 MoveHelp: test cs:HelpFlag,1 1648 jnz MH_ok 1649 jmp MH_HelpClosed 1650 MH_ok: push cs:ShowAllNumber 1651 mov cs:ShowAllNumber,5 1652 mov cs:MH_CX,cx 1653 mov ax,cs:SH_CX 1654 mov cs:MH_OldSH_CX,ax 1655 mov dx,1 1656 xchg cs:HelpPtr,dx 1657 call SH_Calculate 1658 mov cs:ActiveFlags,0000000010000000b 1659 xor ax,ax 1660 mov cs:FkeysBuffer[7*size FkeyStruc].FkeyFlag,al 1661 mov cs:FkeysBuffer[8*size FkeyStruc].FkeyFlag,al 1662 mov cs:FkeysBuffer[9*size FkeyStruc].FkeyFlag,al 1663 mov cs:ScreenIOparams.CursorFlag,0 1664 MH_Loop0: mov cx,cs:MH_CX 1665 call ReadKey 1666 mov di,offset MH_Keys 1667 mov cx,offset MH_Subrt- offset MH_Keys 1668 call CalcCommand 1669 jc MH_Loop0 1670 shl di,1 1671 call cs:MH_Subrt[di] 1672 jnc MH_Loop0 1673 mov cs:HelpPtr,dx 1674 call SH_Calculate 1675 mov al,1 1676 mov cs:FkeysBuffer[7*size FkeyStruc].FkeyFlag,al 1677 mov cs:FkeysBuffer[8*size FkeyStruc].FkeyFlag,al 1678 mov cs:FkeysBuffer[9*size FkeyStruc].FkeyFlag,al 1679 mov cs:ScreenIOparams.CursorFlag,1 1680 pop cs:ShowAllNumber 1681 GetLineService _GL_ClrBuff 1682 MH_HelpClosed: ret 1683 1684 MH_Up: mov cx,cs:SH_CX 1685 ScreenIOservice _CALCXY 1686 cmp ch,1 1687 je MH_UpRet 1688 sub cs:SH_CX,80*2 1689 MH_UpRet: clc 1690 ret 1691 MH_Down: mov cx,cs:SH_CX 1692 ScreenIOservice _CALCXY 1693 cmp ch,12 1694 je MH_DownRet 1695 add cs:SH_CX,80*2 1696 MH_DownRet: clc 1697 ret 1698 MH_Left: mov cx,cs:SH_CX 1699 ScreenIOservice _CALCXY 1700 cmp cl,0 1701 je MH_LeftRet 1702 sub cs:SH_CX,2 1703 MH_LeftRet: clc 1704 ret 1705 MH_Right: mov cx,cs:SH_CX 1706 ScreenIOservice _CALCXY 1707 cmp cl,43 1708 je MH_RightRet 1709 add cs:SH_CX,2 1710 MH_RightRet: clc 1711 ret 1712 1713 MH_Home: mov cs:SH_CX,0 1714 clc 1715 ret 1716 MH_End: mov cs:SH_CX,6E0h 1717 clc 1718 ret 1719 MH_PgUp: mov cs:SH_CX,56h 1720 clc 1721 ret 1722 MH_PgDn: mov cs:SH_CX,736h 1723 clc 1724 ret 1725 MH_Cntr: mov cs:SH_CX,3EAh 1726 clc 1727 ret 1728 MH_Esc: 1729 ; mov ax,cs:MH_OldSH_CX 1730 ; mov cs:SH_CX,ax 1731 MH_Enter: stc 1732 ret 1733 1734 1735 1736 1737 ; -- Print Memory Dump ----------------- 1738 1739 PD_PrnFileSpec db 'PRN',0 1740 PD_FileSpec db 79 dup (0) 1741 PD_Title db ' Appler Debugger Print Out -- Apple ][ Memory Dump',0Dh,0Ah 1742 db '--------------------------------------------------------------------------',0Dh,0Ah 1743 PD_Line db 80 dup (0) 1744 PD_Handle dw ? 1745 PD_ddl db ? 1746 PD_Error_J: jmp PD_Error 1747 PrintDump: GetLineService _GL_GetSymb 1748 dec cl 1749 mov dx,offset PD_PrnFileSpec 1750 or al,al 1751 jz PD_1 1752 xor bx,bx 1753 PD_Loop0: GetLineService _GL_GetSymb 1754 mov cs:PD_FileSpec[bx],al 1755 inc bx 1756 cmp bx,79 1757 je PD_LoopOK 1758 or al,al 1759 jnz PD_Loop0 1760 PD_LoopOK: mov dx,offset PD_FileSpec 1761 PD_1: mov GetKeyParams.RK_ErrPtr,offset PrintingMes 1762 call Prepare4DOS 1763 push ds 1764 push cs 1765 pop ds 1766 xor cx,cx 1767 mov ah,3Ch 1768 int 21h 1769 jc PD_Error_J 1770 mov cs:PD_Handle,ax 1771 mov dx,offset PD_Title 1772 mov cx,139 1773 mov bx,ax 1774 mov ah,40h 1775 int 21h 1776 jc PD_Error_J 1777 pop ds 1778 push ds 1779 mov bx,cs:LeftLimit 1780 mov cx,cs:RightLimit 1781 sub cx,bx 1782 inc cx 1783 cld 1784 jmp PD_NewLine1 1785 PD_NewLine: call PD_PrintLine 1786 jc PD_Error_J 1787 PD_NewLine1: call PD_ClearLine 1788 xor dl,dl 1789 mov dh,58 1790 mov al,bh 1791 call PD_PrintByte 1792 mov al,bl 1793 call PD_PrintByte 1794 mov al,':' 1795 call PD_PrintSymbol 1796 mov al,' ' 1797 call PD_PrintSymbol 1798 mov cs:PD_ddl,8 1799 jmp PD_NL 1800 PD_PrintLoop: mov al,bl 1801 and al,00001111b 1802 jz PD_NewLine 1803 PD_NL: mov al,ds:[bx] 1804 inc bx 1805 call PD_PrintByte 1806 xchg dl,dh 1807 xor ah,ah 1808 mov di,ax 1809 shl di,1 1810 mov al,byte ptr ss:TextChars[di] 1811 cmp al,0DBh 1812 jne PD_2 1813 mov al,20h 1814 PD_2: call PD_PrintSymbol 1815 xchg dl,dh 1816 PD_Space: mov al,' ' 1817 call PD_PrintSymbol 1818 dec cs:PD_ddl 1819 jz PD_Space 1820 loop PD_PrintLoop 1821 call PD_PrintLine 1822 jc PD_Error 1823 mov bx,cs:PD_Handle 1824 mov ah,3Eh 1825 int 21h 1826 jc PD_Error 1827 mov GetKeyParams.RK_ErrPtr,offset PrintOkMes 1828 GetLineService _GL_ClrBuff 1829 clc 1830 PD_Ret: pop ds 1831 call SOD4eraperP 1832 ret 1833 PD_Error: mov GetKeyParams.RK_ErrPtr,offset PrintErrMes 1834 mov ch,cs:GetLineParams.GL_BegPrint 1835 mov cl,cs:GetLineParams.GL_Pos 1836 inc cl 1837 stc 1838 jmp PD_Ret 1839 1840 1841 1842 1843 ; -- Print Assembler ------------------- 1844 1845 PA_Title db ' Appler Debugger Print Out',0Dh,0Ah 1846 db ' 65C02 Disassebler',0Dh,0Ah 1847 db '---------------------------------',0Dh,0Ah 1848 PA_Title1 db 0Dh,0Ah,' Defined Labels List',0Dh,0Ah 1849 db '---------------------------------',0Dh,0Ah 1850 PA_Error_J: jmp PA_Error 1851 PrintAssembler: GetLineService _GL_GetSymb 1852 dec cl 1853 mov dx,offset PD_PrnFileSpec 1854 or al,al 1855 jz PA_1 1856 xor bx,bx 1857 PA_Loop0: GetLineService _GL_GetSymb 1858 mov cs:PD_FileSpec[bx],al 1859 inc bx 1860 cmp bx,79 1861 je PA_LoopOK 1862 or al,al 1863 jnz PA_Loop0 1864 PA_LoopOK: mov dx,offset PD_FileSpec 1865 PA_1: mov GetKeyParams.RK_ErrPtr,offset PrintingMes 1866 call Prepare4DOS 1867 push ds 1868 push cs 1869 pop ds 1870 xor cx,cx 1871 mov ah,3Ch 1872 int 21h 1873 jc PA_Error_J 1874 mov cs:PD_Handle,ax 1875 mov dx,offset PA_Title 1876 mov cx,93 1877 mov bx,ax 1878 mov ah,40h 1879 int 21h 1880 jc PA_Error_J 1881 pop ds 1882 push ds 1883 mov si,cs:LeftLimit 1884 PA_Loop1: call PD_ClearLine 1885 gotoxy 1Ah,2 ; Unvisible 1886 mov dx,si 1887 call OneInstr 1888 mov cx,29 1889 call PD_GetScreen 1890 call PD_PrintLine 1891 jc PA_Error_J 1892 cmp dx,si 1893 ja PA_Exit 1894 cmp si,cs:RightLimit 1895 jbe PA_Loop1 1896 PA_Exit: cmp cs:SymbPtr,0 1897 jz PA_NoLabs 1898 push cs 1899 pop ds 1900 mov dx,offset PA_Title1 1901 mov cx,65 1902 mov bx,PD_Handle 1903 mov ah,40h 1904 int 21h 1905 jc PA_Error 1906 pop ds 1907 push ds 1908 xor bx,bx 1909 mov si,bx 1910 mov dx,28 1911 PA_ShowLabLoop: call PD_ClearLine 1912 gotoxy 1Ah,2 1913 call PrintSymbol 1914 gotoxy 1Ah,30 1915 mov al,'=' 1916 ScreenIOservice _SYMBPRINT 1917 mov al,byte ptr cs:SymbVal[si+1] 1918 ScreenIOservice _BYTEPRINT 1919 mov al,byte ptr cs:SymbVal[si] 1920 ScreenIOservice _BYTEPRINT 1921 mov cx,33 1922 call PD_GetScreen 1923 call PD_PrintLine 1924 add si,2 1925 inc bx 1926 cmp bx,cs:SymbValPtr 1927 jb PA_ShowLabLoop 1928 PA_NoLabs: mov bx,cs:PD_Handle 1929 mov ah,3Eh 1930 int 21h 1931 jc PA_Error 1932 mov GetKeyParams.RK_ErrPtr,offset PrintAsmOkMes 1933 GetLineService _GL_ClrBuff 1934 clc 1935 PA_Ret: pop ds 1936 call SOD4eraperP 1937 ret 1938 PA_Error: mov GetKeyParams.RK_ErrPtr,offset PrintAsmErrMes 1939 mov ch,cs:GetLineParams.GL_BegPrint 1940 mov cl,cs:GetLineParams.GL_Pos 1941 inc cl 1942 stc 1943 jmp PD_Ret 1944 1945 1946 1947 PD_GetScreen: push si ds es 1948 mov ax,seg Screen 1949 mov ds,ax 1950 mov si,offset Screen + 25*80*2 + 4 1951 push cs 1952 pop es 1953 mov di,offset PD_Line 1954 cld 1955 PD_GS_MoveLoop: lodsw 1956 stosb 1957 loop PD_GS_MoveLoop 1958 pop es ds si 1959 ret 1960 1961 1962 1963 PD_ClearLine: push ax cx di es 1964 push cs 1965 pop es 1966 mov di,offset PD_Line 1967 mov al,' ' 1968 mov cx,80 1969 cld 1970 rep stosb 1971 mov cx,seg Screen 1972 mov es,cx 1973 mov di,offset Screen + 25*80*2 1974 mov cx,70*2 1975 rep stosb 1976 pop es di cx ax 1977 ret 1978 1979 PL_cr db 0Dh,0Ah 1980 PD_PrintLine: push ax bx cx dx ds 1981 push cs 1982 pop ds 1983 mov bx,offset PD_Line + 79 1984 mov cx,80 1985 PD_PL_Loop: cmp byte ptr cs:[bx],' ' 1986 jne PD_PL_Cont 1987 dec bx 1988 dec cx 1989 jnz PD_PL_Loop 1990 PD_PL_Cont: mov bx,cs:PD_Handle 1991 mov dx,offset PD_Line 1992 mov ah,40h 1993 int 21h 1994 jc PD_PL_Err 1995 cmp ax,cx 1996 jne PD_PL_Err 1997 mov dx,offset PL_cr 1998 mov cx,2 1999 mov ah,40h 2000 int 21h 2001 jc PD_PL_Err 2002 cmp ax,cx 2003 jne PD_PL_Err 2004 clc 2005 PD_PL_Ret: pop ds dx cx bx ax 2006 ret 2007 PD_PL_Err: stc 2008 jmp PD_PL_Ret 2009 2010 PD_PrintByte: push ax bx dx 2011 xor bx,bx 2012 mov bl,dl 2013 mov dx,ax 2014 shr al,4 2015 cmp al,0Ah 2016 cmc 2017 adc al,30h 2018 daa 2019 mov cs:PD_Line[bx],al 2020 mov al,dl 2021 and al,00001111b 2022 cmp al,0Ah 2023 cmc 2024 adc al,30h 2025 daa 2026 mov cs:PD_Line+1[bx],al 2027 mov dl,bl 2028 pop dx bx ax 2029 add dl,2 2030 ret 2031 2032 PD_PrintSymbol: push bx 2033 xor bx,bx 2034 mov bl,dl 2035 mov cs:PD_Line[bx],al 2036 inc dl 2037 pop bx 2038 ret 2039 2040 2041 2042 2043 ; -- Sound ON/OFF ---------------------- 2044 2045 SoundOnOff: call OnOff 2046 jc SOO_ret 2047 mov ax,offset C030r 2048 mov bx,offset C030w 2049 jnz SOO_go 2050 mov ax,offset C020r 2051 mov bx,offset C020w 2052 SOO_go: push es 2053 mov cx,ss 2054 mov es,cx 2055 mov cx,16 2056 mov di,offset C0xxRead + 2*30h 2057 cld 2058 rep stosw 2059 mov ax,bx 2060 mov cx,16 2061 mov di,offset C0xxWrite + 2*30h 2062 rep stosw 2063 pop es 2064 call ShowPrevIns 2065 GetLineService _GL_ClrBuff 2066 SOO_ret: ret 2067 2068 2069 2070 RecordLen equ 1000h 2071 db 0 2072 RecordBuffer dw RecordLen dup (0) 2073 REC_Realtime db 0 2074 2075 ; -- Start Recording ------------------- 2076 2077 RecordStart: GetLineService _GL_GetSymb 2078 call Upcase 2079 or al,al 2080 jz RS_ok 2081 cmp al,'f' 2082 je RS_ok 2083 mov cs:GetKeyParams.RK_ErrPtr,offset BadParam 2084 ret 2085 RS_ok: mov cs:REC_Realtime,al 2086 push es 2087 push cs 2088 pop es 2089 mov di,offset RecordBuffer - 1 2090 mov cx,RecordLen - 2 2091 call StartRecord 2092 pop es 2093 GetLineService _GL_ClrBuff 2094 ; call GoAppleII0 2095 ret 2096 2097 2098 ; -- Stop Recording -------------------- 2099 2100 RecordStop: call StopRecord 2101 mov cs:GetKeyParams.RK_ErrPtr,offset RecPlayedMes 2102 or cx,cx 2103 jz RS_1 2104 cmp cx,RecordLen - 2 2105 je RS_1 2106 mov cs:GetKeyParams.RK_ErrPtr,offset RecordedMes 2107 RS_1: cmp cs:REC_Realtime,0 2108 jz RS_xit 2109 push es 2110 push cs 2111 pop es 2112 mov di,offset RecordBuffer + 1 2113 mov cx,RecordLen 2114 mov al,1 2115 cld 2116 RS_Loop: stosb 2117 inc di 2118 loop RS_Loop 2119 pop es 2120 RS_xit: GetLineService _GL_ClrBuff 2121 ret 2122 2123 2124 ; -- Play Recording -------------------- 2125 2126 RecordPlay: GetLineService _GL_GetSymb 2127 dec cl 2128 or al,al 2129 jz RP_Play 2130 call LoadRec 2131 RP_Play: push ds 2132 push cs 2133 pop ds 2134 mov si,offset RecordBuffer 2135 clc 2136 call SimKbdRq 2137 pop ds 2138 GetLineService _GL_ClrBuff 2139 ; call GoAppleII0 2140 ret 2141 2142 2143 ; -- Load Record ----------------------- 2144 2145 LoadRec: GetLineService _GL_GetSymb ; 'LR' command 2146 dec cl 2147 or al,al 2148 jnz LR_E0 2149 GetLineService _GL_ClrBuff 2150 mov bx,offset Com_LRecord 2151 GetLineService _GL_String 2152 mov al,' ' 2153 GetLineService _GL_Symbol 2154 mov bx,offset REC_FileSpec 2155 GetLineService _GL_String 2156 GetLineService _GL_Home 2157 xor ch,ch 2158 mov cl,4 2159 mov cs:GetKeyParams.RK_ErrPtr,offset LR_EnterMes1 2160 ret 2161 LR_E0: mov byte ptr cs:LS_OpenFileF,3Dh 2162 mov byte ptr cs:LS_RWfileF,3Fh 2163 mov word ptr cs:LS_ErrPtr,offset RecErrMes_L 2164 mov word ptr cs:LS_OkPtr,offset RecMes_L 2165 mov word ptr cs:LS_FileSpec,offset REC_FileSpec 2166 mov word ptr cs:LS_Ext,offset REC_Ext 2167 mov word ptr cs:LS_Buffer,offset RecordBuffer 2168 mov word ptr cs:LS_BufferLen,RecordLen * 2 2169 jmp File_LS 2170 2171 2172 ; -- Save Record ----------------------- 2173 2174 REC_FileSpec db 'UNTITLED.REC', 67 dup (0) 2175 REC_Ext db '.REC',0 2176 SaveRec: GetLineService _GL_GetSymb 2177 dec cl 2178 or al,al 2179 jnz SR_E0 2180 GetLineService _GL_ClrBuff 2181 mov bx,offset Com_SRecord 2182 GetLineService _GL_String 2183 mov al,' ' 2184 GetLineService _GL_Symbol 2185 mov bx,offset REC_FileSpec 2186 GetLineService _GL_String 2187 GetLineService _GL_Home 2188 xor ch,ch 2189 mov cl,4 2190 mov cs:GetKeyParams.RK_ErrPtr,offset SR_EnterMes2 2191 ret 2192 SR_E0: mov byte ptr cs:LS_OpenFileF,3Ch 2193 mov byte ptr cs:LS_RWfileF,40h 2194 mov word ptr cs:LS_ErrPtr,offset RecErrMes_S 2195 mov word ptr cs:LS_OkPtr,offset RecMes_S 2196 mov word ptr cs:LS_FileSpec,offset REC_FileSpec 2197 mov word ptr cs:LS_Ext,offset REC_Ext 2198 mov word ptr cs:LS_Buffer,offset RecordBuffer 2199 mov word ptr cs:LS_BufferLen,RecordLen * 2 2200 jmp File_LS 2201 2202 2203 2204 2205 ; ******************************************************************* 2206 ; ** ** 2207 ; ** ** 2208 ; ** COMMANDS SUBROUTINES ** 2209 ; ** ** 2210 ; ** ** 2211 ; ******************************************************************* 2212 2213 2214 ; -- Memory Editor --------------------- 2215 2216 EB_ParamsAddr dw ? 2217 OldCurLen db ? 2218 EB_Commands db 07h,08h,05h,0Bh,06h,20h 2219 db 01h,02h,03h,04h,0Dh 2220 db 18h,0Ch 2221 EB_ComSubrt dw EB_Up,EB_Down,EB_Left,EB_Left,EB_Right,EB_Space 2222 dw EB_Home,EB_End,EB_PgUp,EB_PgDn,EB_Tab 2223 dw EB_Enter,EB_Esc 2224 2225 EB_Init: push ax bx 2226 mov al,cs:[si].EB_MinUp 2227 mov cs:[si].EB_TextCH,al 2228 mov al,cs:[si].EB_MinLeft1 2229 mov cs:[si].EB_TextCL2,al 2230 mov al,cs:[si].EB_MinLeft2 2231 mov cs:[si].EB_TextCL1,al 2232 mov bx,cs:[si].EB_MemAdr 2233 mov ax,cs:[bx] 2234 mov cs:[si].EB_Address,ax 2235 pop bx ax 2236 ret 2237 2238 EB_Lcx: mov cl,cs:[si].EB_TextCL1 2239 mov cs:ScreenIOparams.CursorLen,1 2240 cmp cs:[si].EB_TextOrHex,0 2241 jnz EB_Lcx1 2242 mov cl,cs:[si].EB_TextCL2 2243 mov cs:ScreenIOparams.CursorLen,4 2244 EB_Lcx1: mov ch,cs:[si].EB_TextCH 2245 ret 2246 2247 MemoryEditor: mov si,cs:EB_ParamsAddr 2248 mov al,cs:ScreenIOparams.CursorLen 2249 mov cs:OldCurLen,al 2250 mov cs:ScreenIOparams.CursorColor,40h 2251 mov cs:[si].EB_FirstFl,1 2252 mov bx,cs:[si].EB_MemAdr 2253 GetLineService _GL_GetSymb 2254 dec cl 2255 or al,al 2256 jz EB_Loop0 2257 call GetAddress 2258 mov cs:[bx],ax 2259 call EB_Init 2260 2261 EB_Loop0: call EB_Lcx 2262 mov ah,0Bh 2263 call ReadKey 2264 mov di,offset EB_Commands 2265 mov cx,offset EB_ComSubrt - offset EB_Commands 2266 call CalcCommand 2267 jc EB_CallDoIt 2268 shl di,1 2269 call cs:EB_ComSubrt[di] 2270 mov cs:[si].EB_FirstFl,1 2271 jnc EB_Loop0 2272 2273 EB_ret: mov al,cs:OldCurLen 2274 mov cs:ScreenIOparams.CursorLen,al 2275 GetLineService _GL_ClrBuff 2276 ret 2277 2278 EB_CallDoIt: call EB_DoIt 2279 jmp EB_Loop0 2280 2281 EB_DoIt: push ax bx di 2282 cmp cs:[si].EB_TextOrHex,0 2283 jnz EB_DoText 2284 or al,20h 2285 cmp al,'0' 2286 jb EB_DoItRet2 2287 cmp al,'9' 2288 jbe E_Num 2289 cmp al,'a' 2290 jb EB_DoItRet2 2291 cmp al,'f' 2292 ja EB_DoItRet2 2293 sub al,27h 2294 E_Num: sub al,'0' 2295 mov di,cs:[si].EB_Address 2296 mov bh,[di] 2297 test cs:[si].EB_FirstFl,1 2298 jz EB_NotNew 2299 xor bh,bh 2300 EB_NotNew: shl bh,4 2301 or bh,al 2302 mov [di],bh 2303 EB_DoItRet: test cs:[si].EB_FirstFL,1 2304 jnz EB_DoItRet1 2305 call EB_Right 2306 EB_DoItRet1: xor cs:[si].EB_FirstFl,1 2307 EB_DoItRet2: pop di bx ax 2308 ret 2309 2310 EB_DoText: mov di,cs:[si].EB_Address 2311 or al,80h 2312 mov [di],al 2313 call EB_Right 2314 jmp EB_DoItRet2 2315 2316 2317 EB_Space: cmp cs:[si].EB_TextOrHex,0 2318 jz EB_Right 2319 call EB_DoIt 2320 clc 2321 ret 2322 2323 EB_Right: push ax bx cx 2324 mov bx,cs:[si].EB_MemAdr 2325 mov cl,cs:[si].EB_TextCL2 2326 mov al,cs:[si].EB_TextCL1 2327 mov ch,cs:[si].EB_TextCH 2328 cmp cl,cs:[si].EB_Center 2329 jne EB_R0 2330 inc cl 2331 inc al 2332 EB_R0: add cl,3 2333 inc al 2334 cmp cl,cs:[si].EB_MaxRight1 2335 ja EB_R1 2336 inc cs:[si].EB_Address 2337 jmp EB_R3 2338 EB_R1: mov cl,cs:[si].EB_MinLeft1 2339 mov al,cs:[si].EB_MinLeft2 2340 inc ch 2341 cmp ch,cs:[si].EB_MaxDown 2342 ja EB_R2 2343 inc cs:[si].EB_Address 2344 jmp EB_R3 2345 EB_R2: push ax 2346 mov ax,cs:[bx] 2347 add ax,cs:[si].EB_BytesInLine 2348 mov cs:[bx],ax 2349 call cs:[si].EB_InitBuffProc 2350 pop ax 2351 inc cs:[si].EB_Address 2352 mov ch,cs:[si].EB_MaxDown 2353 EB_R3: mov cs:[si].EB_TextCL2,cl 2354 mov cs:[si].EB_TextCL1,al 2355 mov cs:[si].EB_TextCH,ch 2356 pop cx bx ax 2357 clc 2358 ret 2359 2360 EB_Left: push ax bx cx 2361 mov bx,cs:[si].EB_MemAdr 2362 mov cl,cs:[si].EB_TextCL2 2363 mov al,cs:[si].EB_TextCL1 2364 mov ch,cs:[si].EB_TextCH 2365 sub cl,3 2366 dec al 2367 mov ah,cs:[si].EB_Center 2368 inc ah 2369 cmp cl,ah 2370 jne EB_L0 2371 dec cl 2372 dec al 2373 EB_L0: cmp cl,cs:[si].EB_MinLeft1 2374 jb EB_L1 2375 dec cs:[si].EB_Address 2376 jmp EB_L3 2377 EB_L1: mov cl,cs:[si].EB_MaxRight1 2378 mov al,cs:[si].EB_MaxRight2 2379 dec ch 2380 cmp ch,cs:[si].EB_MinUp 2381 jb EB_L2 2382 dec cs:[si].EB_Address 2383 jmp EB_L3 2384 EB_L2: push ax 2385 mov ax,cs:[bx] 2386 sub ax,cs:[si].EB_BytesInLine 2387 mov cs:[bx],ax 2388 call cs:[si].EB_InitBuffProc 2389 pop ax 2390 dec cs:[si].EB_Address 2391 mov ch,cs:[si].EB_MinUp 2392 EB_L3: mov cs:[si].EB_TextCL2,cl 2393 mov cs:[si].EB_TextCL1,al 2394 mov cs:[si].EB_TextCH,ch 2395 pop cx bx ax 2396 clc 2397 ret 2398 2399 EB_Up: push ax bx cx 2400 mov bx,cs:[si].EB_MemAdr 2401 mov ax,cs:[si].EB_BytesInLine 2402 call EB_Lcx 2403 dec ch 2404 cmp ch,cs:[si].EB_MinUp 2405 jae EB_U1 2406 mov ch,cs:[si].EB_MinUp 2407 sub cs:[bx],ax 2408 call cs:[si].EB_InitBuffProc 2409 EB_U1: sub cs:[si].EB_Address,ax 2410 EB_U2: mov cs:[si].EB_TextCH,ch 2411 pop cx bx ax 2412 clc 2413 ret 2414 2415 EB_Down: push ax bx cx 2416 mov bx,cs:[si].EB_MemAdr 2417 mov ax,cs:[si].EB_BytesInLine 2418 call EB_Lcx 2419 inc ch 2420 cmp ch,cs:[si].EB_MaxDown 2421 jbe EB_D1 2422 mov ch,cs:[si].EB_MaxDown 2423 add cs:[bx],ax 2424 call cs:[si].EB_InitBuffProc 2425 EB_D1: add cs:[si].EB_Address,ax 2426 EB_D2: mov cs:[si].EB_TextCH,ch 2427 pop cx bx ax 2428 clc 2429 ret 2430 2431 EB_Tab: test cs:[si].EB_TabFlag,1 2432 jz EB_TabRet 2433 xor cs:[si].EB_TextOrHex,0FFh 2434 mov cs:[si].EB_FirstFl,1 2435 EB_TabRet: clc 2436 ret 2437 2438 EB_PgUp: push bx 2439 mov bx,cs:[si].EB_MemAdr 2440 sub cs:[si].EB_Address, 4 * 16 2441 sub word ptr cs:[bx], 4 * 16 2442 call cs:[si].EB_InitBuffProc 2443 clc 2444 pop ax 2445 ret 2446 2447 EB_PgDn: push bx 2448 mov bx,cs:[si].EB_MemAdr 2449 add cs:[si].EB_Address, 4 * 16 2450 add word ptr cs:[bx], 4 * 16 2451 call cs:[si].EB_InitBuffProc 2452 clc 2453 pop bx 2454 ret 2455 2456 EB_Home: push ax 2457 mov al,cs:[si].EB_MinLeft1 2458 EB_H0: cmp cs:[si].EB_TextCL2,al 2459 je EB_H1 2460 call EB_Left 2461 jmp EB_H0 2462 EB_H1: mov al,cs:[si].EB_MinUp 2463 EB_H2: cmp cs:[si].EB_TextCH,al 2464 je EB_H3 2465 call EB_Up 2466 jmp EB_H2 2467 EB_H3: pop ax 2468 clc 2469 ret 2470 2471 EB_End: push ax 2472 mov al,cs:[si].EB_MaxRight1 2473 EB_E0: cmp cs:[si].EB_TextCL2,al 2474 je EB_E1 2475 call EB_Right 2476 jmp EB_E0 2477 EB_E1: mov al,cs:[si].EB_MaxDown 2478 EB_E2: cmp cs:[si].EB_TextCH,al 2479 je EB_E3 2480 call EB_Down 2481 jmp EB_E2 2482 EB_E3: pop ax 2483 clc 2484 ret 2485 2486 EB_Esc: 2487 EB_Enter: stc 2488 ret 2489 2490 2491 2492 2493 ; -- Save/Load labels ------------------ 2494 2495 LS_Ext dw ? 2496 LS_FileSpec dw ? 2497 LS_StoreCX dw ? 2498 LS_OpenFileF db ? 2499 LS_RWfileF db ? 2500 LS_ErrPtr dw ? 2501 LS_OkPtr dw ? 2502 LS_Buffer dw ? 2503 LS_BufferLen dw ? 2504 2505 File_LS: call Prepare4DOS 2506 push cx ds 2507 mov bx,cs:LS_FileSpec 2508 mov dx,79 2509 LAB_LS_0: GetLineService _GL_GetSymb 2510 mov byte ptr cs:[bx],al 2511 inc bx 2512 dec dx 2513 jz LAB_LS_1 2514 or al,al 2515 jnz LAB_LS_0 2516 LAB_LS_1: push ds 2517 push cs 2518 pop ds 2519 mov si,cs:LS_Ext 2520 mov di,cs:LS_FileSpec 2521 call AddExt 2522 pop ds 2523 mov cs:LS_StoreCX,cx 2524 push cs 2525 pop ds 2526 mov dx,cs:LS_FileSpec 2527 xor cx,cx 2528 mov ah,cs:LS_OpenFileF 2529 xor al,al 2530 int 21h 2531 jc LAB_LS_Err1 2532 mov bx,ax 2533 mov dx,cs:LS_Buffer 2534 mov cx,cs:LS_BufferLen 2535 mov ah,cs:LS_RWfileF 2536 int 21h 2537 jc LAB_LS_Err 2538 cmp ax,cx 2539 jne LAB_LS_Err 2540 mov ah,3Eh 2541 int 21h 2542 pop ds cx 2543 mov ax,cs:LS_OkPtr 2544 mov cs:GetKeyParams.RK_ErrPtr,ax 2545 call SOD4eraperP 2546 GetLineService _GL_ClrBuff 2547 clc 2548 ret 2549 LAB_LS_Err: mov ah,3Eh 2550 int 21h 2551 LAB_LS_Err1: pop ds cx 2552 mov ax,cs:LS_ErrPtr 2553 mov cs:GetKeyParams.RK_ErrPtr,ax 2554 mov cx,cs:LS_StoreCX 2555 call SOD4eraperP 2556 inc cl 2557 stc 2558 ret 2559 2560 2561 2562 2563 ; -- Hook INT 24h ---------------------- 2564 2565 Prepare4DOS: saveall 2566 pushf 2567 mov cs:FkeysMainFlag,0 2568 call ShowAll 2569 ScreenIOservice _SHOWSCREEN 2570 call far ptr SystemTINI 2571 popf 2572 restoreall 2573 ret 2574 2575 2576 2577 ; -- Unhook INT 24h -------------------- 2578 2579 SOD4eraperP: saveall ; Unchain Critical Errors proc 2580 pushf 2581 mov cs:FkeysMainFlag,1 2582 mov ax,Emulate 2583 mov es,ax 2584 mov byte ptr [C000],0 2585 call far ptr SystemINIT 2586 popf 2587 restoreall 2588 ret 2589 2590 2591 2592 2593 ; -- ON/OFF ---------------------------- 2594 2595 OnOff: push ax 2596 GetLineService _GL_GetSymb 2597 call Upcase 2598 cmp al,'o' 2599 jne OO_Error 2600 GetLineService _GL_GetSymb 2601 call Upcase 2602 cmp al,'n' 2603 je OO_On 2604 cmp al,'f' 2605 jne OO_Error 2606 GetLineService _GL_GetSymb 2607 call Upcase 2608 cmp al,'f' 2609 je OO_Off 2610 OO_Error: mov cs:GetKeyParams.RK_ErrPtr,offset OnOffMes 2611 inc cl 2612 stc 2613 jmp OO_ret 2614 OO_On: mov ax,1 2615 or ax,ax 2616 clc 2617 jmp OO_ret 2618 OO_Off: xor ax,ax 2619 clc 2620 OO_ret: pop ax 2621 ret 2622 2623 2624 2625 2626 ; ******************************************************************* 2627 ; ** ** 2628 ; ** ** 2629 ; ** S H O W A L L ** 2630 ; ** ** 2631 ; ** ** 2632 ; ******************************************************************* 2633 2634 ShowAllNumber dw 0 2635 ShowAllProcs dw SA_Command,SA_EditA,SA_EditB,SA_Program,SA_Regs,SA_Help,SA_Labels 2636 SA_Command dw ShowLabels,ShowProgram,ShowRegs,ShowStack,ShowBreaks,ShowDumpA 2637 dw ShowDumpB,ShowFuncKeys,ShowCommand,ShowMessage 2638 dw ShowLine,ShowHelp 2639 SA_EditA dw ShowLabels,ShowCommand,ShowLine,ShowProgram,ShowMessage,ShowRegs 2640 dw ShowStack,ShowBreaks,ShowDumpB,ShowHelp,ShowFuncKeys 2641 dw ShowDumpA 2642 SA_EditB dw ShowLabels,ShowCommand,ShowLine,ShowProgram,ShowMessage,ShowRegs 2643 dw ShowStack,ShowBreaks,ShowDumpA,ShowHelp,ShowFuncKeys 2644 dw ShowDumpB 2645 SA_Program dw ShowLabels,ShowRegs,ShowStack,ShowBreaks,ShowDumpA,ShowDumpB 2646 dw ShowCommand,ShowHelp,ShowFuncKeys 2647 dw ShowProgram,ShowLine,ShowMessage 2648 SA_Regs dw ShowLabels,ShowCommand,ShowLine,ShowProgram,ShowMessage 2649 dw ShowStack,ShowBreaks,ShowDumpA,ShowDumpB,ShowHelp,ShowFuncKeys 2650 dw ShowRegs 2651 SA_Help dw ShowProgram,ShowRegs,ShowStack,ShowBreaks,ShowDumpA 2652 dw ShowDumpB,ShowCommand,ShowMessage,ShowLine,ShowLabels 2653 dw ShowHelp,ShowFuncKeys 2654 SA_Labels dw ShowStack,ShowBreaks,ShowDumpA,ShowDumpB,ShowCommand,ShowProgram 2655 dw ShowMessage,ShowLine,ShowRegs,ShowHelp,ShowFuncKeys 2656 dw ShowLabels 2657 2658 ActiveFlags dw 0 2659 KbdShifts dw ? 2660 ShowAll proc far 2661 push bx dx es ds bp 2662 push word ptr cs:ScreenIOparams.CursorColor 2663 push word ptr cs:ScreenIOparams.CursorLen 2664 push word ptr cs:ScreenIOparams.CursorFlag 2665 mov bx,Keyboard 2666 mov es,bx 2667 assume es:Keyboard 2668 mov bx,es:k_Shifts 2669 mov cs:KbdShifts,bx 2670 mov cs:ScreenIOparams.CursorFlag,1 2671 mov bx,Emulate 2672 mov es,bx 2673 mov bx,Apple 2674 mov ds,bx 2675 mov dx,12 2676 mov bx,cs:ShowAllNumber 2677 shl bx,1 2678 mov bx,cs:ShowAllProcs[bx] 2679 SA_Loop: call cs:[bx] 2680 add bx,2 2681 dec dx 2682 jnz SA_Loop 2683 pop word ptr cs:ScreenIOparams.CursorFlag 2684 pop word ptr cs:ScreenIOparams.CursorLen 2685 pop word ptr cs:ScreenIOparams.CursorColor 2686 pop bp ds es dx bx 2687 ret 2688 ShowAll endp 2689 2690 2691 ; -- Draw box -------------------------- 2692 ; Entry: 2693 ; AH = Active Flag Bit 2694 ; CX = HTAB & VTAB 2695 ; BX = Offset of the strings 2696 ; DL = Length of the box line - 1 2697 ; DH = Number of lines - 1 2698 ; Destroy: 2699 ; AX,BX,CX,DX 2700 DB_CX dw ? 2701 DrawBox: push ax 2702 mov ax,cx 2703 add ax,80 * 2 2704 mov cs:DB_CX,ax 2705 pop ax 2706 test cs:ActiveFlags,ax 2707 mov ah,7 2708 jz DB_ok1 2709 mov ah,0Eh 2710 DB_ok1: ScreenIOservice _STRINGPRINT 2711 mov bx,cs:ScreenIOparams.SP_bx 2712 dec dh 2713 mov al,dh 2714 mov dx,cs:DB_CX 2715 DB_Loop1: mov cx,dx 2716 add dx,80 * 2 2717 ScreenIOservice _STRINGPRINT 2718 dec al 2719 jnz DB_Loop1 2720 mov cx,dx 2721 mov bx,cs:ScreenIOparams.SP_bx 2722 ScreenIOservice _STRINGPRINT 2723 ret 2724 2725 2726 2727 ; -------------------------------------------------------------------------- 2728 ; - SHOW LINE 2729 2730 ShowLine: ScreenIOservice _SHOWLINE 2731 ret 2732 2733 ; -------------------------------------------------------------------------- 2734 ; - SHOW MESSAGE 2735 2736 SM_Dec? db 0 2737 ShowMessage: push ax bx cx 2738 gotoxy 16,0 2739 mov bx,offset SP_Str3 2740 test cs:ActiveFlags,0000000000000010b 2741 mov ah,0Eh 2742 jnz SM_ok1 2743 mov ah,7 2744 SM_ok1: ScreenIOservice _STRINGPRINT 2745 mov bx,cs:GetKeyParams.RK_ErrPtr 2746 or bx,bx 2747 jz SM_Ret 2748 gotoxy 16,1 2749 mov ah,0Ch 2750 ScreenIOservice _STRINGPRINT 2751 cmp cs:SM_Dec?,0 2752 jz SM_Ret 2753 pop cx 2754 dec cl 2755 push cx 2756 SM_Ret: pop cx bx ax 2757 ret 2758 2759 FirstMsg db 1,0Ah,'Appler Debugger, v1.0',0 2760 UnknownCmd db 'Unknown command',0 2761 IllegalNum db 'Bad address or number',0 2762 NotHexMes db 'Hex digit expected',0 2763 NotBinMes db 'Bin digit expected',0 2764 NotDecMes db 'Dec digit expected',0 2765 BigNumMes db 'Address or number is too big',0 2766 NumbMissMes db 'Address or number expected',0 2767 BadInstr db 'Bad instruction',0 2768 BadParam db 'Bad or missing parameter',0 2769 NoStringMes db 'Search string expected',0 2770 ByteExpMes db 'Byte expected',0 2771 NotFound db 'String not found',0 2772 NotIdent db 'Different byte found',0 2773 Identifical db 1,0Ah,'Bytes are identical',0 2774 AdressError db 'End below begin',0 2775 LS_EnterMes1 db 1,0Ah,' to load labels',0 2776 LabMes_L db 1,0Ah,'Labels loaded',0 2777 LabErrMes_L db 'Error loading labels',0 2778 LS_EnterMes2 db 1,0Ah,' to save labels',0 2779 LabMes_S db 1,0Ah,'Labels saved',0 2780 LabErrMes_S db 'Error saving labels',0 2781 EqualMess db '''='' expected',0 2782 BreakNumMES db 'Breakpoint number expected',0 2783 SymMissErr db 'Identifier expected',0 2784 SymNoMemErr db 'No memory to define this label',0 2785 SymNotFndErr db 'Label not defined',0 2786 SymNoSymbErr db 'No labels defined',0 2787 OnOffMes db 'ON or OFF expected',0 2788 GA_PlusMes db 1,7,'Carry',0 2789 GA_MinusMes db 1,7,'Borrow',0 2790 GA_MulMes db 1,7,'Overflow',0 2791 ZeroDivMes db 'Division by zero',0 2792 GA_DivMes db 1,0Ah,'Remainder=' 2793 GA_DivRest db '0000',1,7,' (truncated)',0 2794 ExecutingMes db 1,8Ah,'Executing',0 2795 ToRTSmes db 1,8Ah,'Executing to RTS...',0 2796 InvalidOpcode db 1,8Ch,'Unexpected Breakpoint',0 2797 BreakpointMes db 1,0Ch,'Breakpoint ' 2798 BreakpointNum db '? reached',0 2799 PrintingMes db 1,8Ah,'Printing',0 2800 PrintOkMes db 1,0Ah,'Memory Dump Printed OK',0 2801 PrintErrMes db 'Error printing Memory Dump',0 2802 PrintAsmOkMes db 1,0Ah,'Program Printed OK',0 2803 PrintAsmErrMes db 'Error printing Program',0 2804 LR_EnterMes1 db 1,0Ah,' to load macro',0 2805 RecMes_L db 1,0Ah,'Macro loaded',0 2806 RecErrMes_L db 'Error loading macro',0 2807 SR_EnterMes2 db 1,0Ah,' to save macro',0 2808 RecMes_S db 1,0Ah,'Macro saved',0 2809 RecErrMes_S db 'Error saving Macro',0 2810 RecPlayedMes db 1,0Ah,'Macro played',0 2811 RecordedMes db 1,0Ah,'Macro recorded',0 2812 2813 ; -------------------------------------------------------------------------- 2814 ; - SHOW COMMAND 2815 2816 ShowCommand: push ax cx 2817 gotoxy 17,0 2818 mov ax,0700h+'>' 2819 ScreenIOservice _SYMBPRINT 2820 SCM_Ret: pop cx ax 2821 ret 2822 2823 ; -------------------------------------------------------------------------- 2824 ; - SHOW PROGRAM 2825 2826 AssembAdr dw 0 ; This is the start address. 2827 AssembAdr1 dw 0 2828 ShowPrev? db 0 2829 PrevAdr dw ? 2830 SP_Str db 'ÚProgramÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0 2831 db '³ ³',0 2832 SP_Str3 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0 2833 SP_CursorXY dw 401h 2834 ShowProgram: push ax bx cx dx si es 2835 gotoxy 1,0 2836 mov bx,offset SP_Str 2837 mov dx,0F22h 2838 mov ax,0000000000000010b 2839 call DrawBox 2840 test cs:ShowPrev?,1 2841 jz SP_Dont 2842 gotoxy 3,2 2843 mov si,cs:PrevAdr 2844 call OneInstr 2845 SP_Dont: mov si,cs:AssembAdr 2846 gotoxy 4,2 2847 mov dx,12 2848 mov cs:CalcFlag,1 2849 AsmLoop0: call OneInstr 2850 mov cs:CalcFlag,0 2851 add cx,80 * 2 2852 dec dx 2853 jnz ASMLoop0 2854 mov cs:AssembAdr1,si 2855 mov cx,cs:SP_CursorXY 2856 mov cs:ScreenIOparams.CursorColor,10h 2857 mov cs:ScreenIOparams.CursorLen,31 2858 ScreenIOservice _SHOWCURSOR 2859 gotoxy 1,1 2860 mov ax,0E00h+'P' 2861 cmp cs:FkeysMainFlag,0 2862 jz SP_Ret 2863 ScreenIOservice _SYMBPRINT 2864 SP_Ret: pop es si dx cx bx ax 2865 ret 2866 assume es:Emulate 2867 2868 2869 ; -- Scroll Program Window DOWN -------- 2870 2871 UP: push cx ax bx si ; Scrolls ASM window down. 2872 mov si,cs:AssembAdr 2873 call PrevInstAdr 2874 jnc UP_0 2875 dec si 2876 UP_0: mov cs:AssembAdr,si 2877 call PrevInstAdr 2878 jnc UP_1 2879 dec si 2880 UP_1: mov cs:PrevAdr,si 2881 call BuffDisasm 2882 clc 2883 mov cs:ShowPrev?,1 2884 pop si bx ax cx 2885 ret 2886 2887 2888 ; -- Scroll Program Window UP ---------- 2889 2890 DOWN: push si ax cx 2891 mov si,cs:AssembAdr 2892 mov cs:ShowPrev?,1 2893 mov cs:PrevAdr,si 2894 gotoxy 7,2 2895 call OneInstr 2896 mov cs:AssembAdr,si 2897 call BuffDisasm 2898 pop cx ax si 2899 ret 2900 2901 2902 ; -- Calc Previous Instruction Adr ----- 2903 ; Entry: 2904 ; SI = Start_Address 2905 ; Exit: 2906 ; SI = Previous Instruction Address 2907 ; CF = 1 if can't or 0 otherwise 2908 2909 PIA_Counter = 25 2910 PIA_BegAdr dw ? 2911 PIA_Adr dw ? 2912 PrevInstAdr: push ax bx ; I: SI -> Address. O: SI <- PrevInstAdr 2913 mov cs:PIA_BegAdr,si 2914 sub si,PIA_Counter 2915 PIA_Loop0: mov cs:PIA_adr,si 2916 PIA_Loop1: xor bx,bx 2917 mov bl,[si] 2918 mov al,cs:InstrLongTbl[bx] 2919 test al,00000100b 2920 jz PIA_Valid 2921 PIA_Next: mov si,cs:PIA_adr 2922 inc si 2923 cmp si,cs:PIA_BegAdr 2924 je PIA_Cannot 2925 jmp PIA_Loop0 2926 PIA_Valid: xor ah,ah 2927 and al,00000011b 2928 add ax,si 2929 cmp ax,cs:PIA_BegAdr 2930 ja PIA_Next 2931 je PIA_End 2932 mov si,ax 2933 jmp PIA_Loop1 2934 PIA_End: clc 2935 PIA_End1: pop bx ax 2936 ret 2937 PIA_Cannot: stc 2938 jmp PIA_End1 2939 2940 2941 ; -- Show Previous Instruction --------- 2942 2943 ShowPrevIns: push cx si 2944 mov si,cs:AssembAdr 2945 call PrevInstAdr 2946 jnc SPI_ok 2947 dec si 2948 SPI_ok: mov cs:ShowPrev?,1 2949 mov cs:PrevAdr,si 2950 pop si cx 2951 ret 2952 2953 2954 ; -- Show One Instruction -------------- 2955 ; Entry: 2956 ; SI = Start_Address 2957 ; CH = VTAB 2958 ; Exit: 2959 ; SI = Next Instruction Address 2960 2961 OI_ClrStr: db ' ',0 2962 CalcFlag db 0 2963 OI_StoreCX dw ? 2964 OneInstr: push ax bx cx dx 2965 mov cs:OI_StoreCX,cx 2966 mov bx,offset OI_ClrStr 2967 ScreenIOservice _STRINGPRINT 2968 xor ax,ax 2969 mov bx,ax 2970 mov al,[si] 2971 mov bl,al 2972 add bx,ax 2973 add bx,ax 2974 mov ah,0Bh 2975 mov cx,cs:OI_StoreCX 2976 add cx,0Fh * 2 2977 mov al,cs:InstrTable[bx] 2978 ScreenIOservice _SYMBPRINT 2979 mov al,cs:InstrTable[bx+1] 2980 ScreenIOservice _SYMBPRINT 2981 mov al,cs:InstrTable[bx+2] 2982 ScreenIOservice _SYMBPRINT 2983 mov al,' ' 2984 ScreenIOservice _SYMBPRINT 2985 clc 2986 mov ah,07h 2987 call CheckBreak 2988 jc OI_ok1 2989 mov ah,0Ch 2990 OI_ok1: xor dl,dl 2991 xchg dl,cs:ScreenIOparams.SP_BufFlag 2992 mov bx,si 2993 mov al,7 2994 mov cx,cs:OI_StoreCX 2995 call WordPrintS 2996 mov ax,0700h+':' 2997 ScreenIOservice _SYMBPRINT 2998 mov cx,cs:OI_StoreCX 2999 add cx,8 * 2 3000 mov ah,3 3001 mov al,[si] 3002 ScreenIOservice _BYTEPRINT 3003 xor bx,bx 3004 mov bl,[si] 3005 mov ah,03h 3006 mov bl,cs:ParamTable[bx] 3007 shl bx,1 3008 mov byte ptr cs:SC_ShowAdr?,1 3009 call word ptr cs:AdrModes[bx] 3010 call ShowCalc 3011 inc si 3012 OI_RET: pop dx cx bx ax 3013 ret 3014 3015 AdrModes dw NoOper,DirVal,ZP,ZPx,Full,FullX,FullY 3016 dw BadX,BadY,ZPy,JMP1,JMP6C,NoOper,BEQ,Indirect,JMP7C 3017 3018 3019 ; -- Addressing Modes Procs ------------ 3020 ; Entry: 3021 ; SI = Address of the first instruction byte 3022 ; Exit: 3023 ; BX = Address to show at the up-right 3024 ; CF = Show (0) or not (1) the contain of address in BX 3025 ; SC_ShowAdr? = Show (1-default) or not (0) the address in BX 3026 ; SI = Address of the last instruction byte 3027 3028 NoOper: stc 3029 ret 3030 3031 DirVal: call PDirVal 3032 inc si 3033 stc 3034 ret 3035 3036 ZP: call PZPadr 3037 inc si 3038 xor bx,bx 3039 mov bl,[si] 3040 clc 3041 mov byte ptr cs:SC_ShowAdr?,0 3042 ret 3043 3044 ZPx: call PZPx 3045 inc si 3046 xor bx,bx 3047 mov bl,[si] 3048 add bl,cs:Regs.X 3049 clc 3050 ret 3051 3052 Full: call PWordAdr 3053 inc si 3054 mov bx,[si] 3055 inc si 3056 clc 3057 mov byte ptr cs:SC_ShowAdr?,0 3058 ret 3059 3060 FullX: call PFullX 3061 inc si 3062 mov bx,[si] 3063 inc si 3064 xor ax,ax 3065 mov al,cs:Regs.X 3066 add bx,ax 3067 clc 3068 ret 3069 3070 FullY: call PFullY 3071 inc si 3072 mov bx,[si] 3073 inc si 3074 xor ax,ax 3075 mov al,cs:Regs.Y 3076 add bx,ax 3077 clc 3078 ret 3079 3080 BadX: call PBadX 3081 inc si 3082 mov bl,[si] 3083 add bl,cs:Regs.X 3084 xor bh,bh 3085 mov al,[bx] 3086 inc bl 3087 mov ah,[bx] 3088 mov bx,ax 3089 clc 3090 ret 3091 3092 BadY: call PBadY 3093 inc si 3094 xor bx,bx 3095 mov bl,[si] 3096 mov al,[bx] 3097 inc bl 3098 mov ah,[bx] 3099 mov bx,ax 3100 xor ax,ax 3101 mov al,cs:Regs.Y 3102 add bx,ax 3103 clc 3104 ret 3105 3106 ZPy: call PZPy 3107 inc si 3108 xor bx,bx 3109 mov bl,[si] 3110 add bl,cs:Regs.Y 3111 clc 3112 ret 3113 3114 JMP1: call Pwordadr 3115 inc si 3116 inc si 3117 stc 3118 ret 3119 3120 JMP6C: call PJ6C 3121 inc si 3122 mov bx,[si] 3123 inc si 3124 mov al,[bx] 3125 inc bl 3126 mov ah,[bx] 3127 mov bx,ax 3128 clc 3129 ret 3130 3131 BEQ: call PBranch 3132 inc si 3133 stc 3134 ret 3135 3136 Indirect: call Pindirect 3137 inc si 3138 mov bl,[si] 3139 xor bh,bh 3140 mov al,[bx] 3141 inc bl 3142 mov ah,[bx] 3143 mov bx,ax 3144 clc 3145 ret 3146 3147 JMP7C: call PJ7C 3148 inc si 3149 mov bl,cs:Regs.X 3150 xor bh,bh 3151 add bx,[si] 3152 mov al,[bx] 3153 inc bl 3154 mov ah,[bx] 3155 mov bx,ax 3156 inc si 3157 clc 3158 ret 3159 3160 ; -- Print Modes Procs ----------------- 3161 ; Entry: 3162 ; SI = Address of the first instruction byte 3163 3164 PrintWORD: mov al,[si+1] 3165 ScreenIOservice _BYTEPRINT 3166 mov al,[si+2] 3167 ScreenIOservice _BYTEPRINT 3168 mov ah,0Bh 3169 mov cs:ScreenIOparams.SP_BufFlag,dl 3170 add cx,5 * 2 3171 ret 3172 3173 PrintBYTE: mov al,[si+1] 3174 ScreenIOservice _BYTEPRINT 3175 mov ah,0Bh 3176 mov cs:ScreenIOparams.SP_BufFlag,dl 3177 add cx,7 * 2 3178 ret 3179 3180 3181 3182 PBadX: call PrintBYTE 3183 mov al,'(' 3184 ScreenIOservice _SYMBPRINT 3185 mov al,5 3186 mov bl,[si+1] 3187 call BytePrintS 3188 mov al,',' 3189 ScreenIOservice _SYMBPRINT 3190 mov al,'X' 3191 ScreenIOservice _SYMBPRINT 3192 mov al,')' 3193 ScreenIOservice _SYMBPRINT 3194 ret 3195 3196 PBadY: call PrintBYTE 3197 mov al,'(' 3198 ScreenIOservice _SYMBPRINT 3199 mov al,5 3200 mov bl,[si+1] 3201 call BytePrintS 3202 mov al,')' 3203 ScreenIOservice _SYMBPRINT 3204 mov al,',' 3205 ScreenIOservice _SYMBPRINT 3206 mov al,'Y' 3207 ScreenIOservice _SYMBPRINT 3208 ret 3209 3210 PZPadr: call PrintBYTE 3211 mov al,9 3212 mov bl,[si+1] 3213 jmp BYTEPRINTS 3214 3215 PDirVal: call PrintBYTE 3216 mov al,'#' 3217 ScreenIOservice _SYMBPRINT 3218 mov al,[si+1] 3219 ScreenIOservice _BYTEPRINT 3220 ret 3221 3222 PZPx: call PrintBYTE 3223 mov al,7 3224 mov bl,[si+1] 3225 call BytePrintS 3226 mov al,',' 3227 ScreenIOservice _SYMBPRINT 3228 mov al,'X' 3229 ScreenIOservice _SYMBPRINT 3230 ret 3231 3232 PZPy: call PrintBYTE 3233 mov al,7 3234 mov bl,[si+1] 3235 call BytePrintS 3236 mov al,',' 3237 ScreenIOservice _SYMBPRINT 3238 mov al,'Y' 3239 ScreenIOservice _SYMBPRINT 3240 ret 3241 3242 PWordAdr: call PrintWORD 3243 mov al,10 3244 mov bx,[si+1] 3245 jmp WordPrintS 3246 3247 PFullX: call PrintWORD 3248 mov al,8 3249 mov bx,[si+1] 3250 call WordPrintS 3251 mov al,',' 3252 ScreenIOservice _SYMBPRINT 3253 mov al,'X' 3254 ScreenIOservice _SYMBPRINT 3255 ret 3256 3257 PFullY: call PrintWORD 3258 mov al,8 3259 mov bx,[si+1] 3260 call WordPrintS 3261 mov al,',' 3262 ScreenIOservice _SYMBPRINT 3263 mov al,'Y' 3264 ScreenIOservice _SYMBPRINT 3265 ret 3266 3267 PJ6C: call PrintWORD 3268 mov al,'(' 3269 ScreenIOservice _SYMBPRINT 3270 mov al,8 3271 mov bx,[si+1] 3272 call WordPrintS 3273 mov al,')' 3274 ScreenIOservice _SYMBPRINT 3275 ret 3276 3277 PBranch: call PrintBYTE 3278 push bx si 3279 mov al,[si+1] 3280 cbw 3281 inc si 3282 inc si 3283 add ax,si 3284 mov bx,ax 3285 mov ax,0B0Ah 3286 call WordPrintS 3287 pop si bx 3288 ret 3289 3290 Pindirect: call PrintBYTE 3291 mov al,'(' 3292 ScreenIOservice _SYMBPRINT 3293 mov al,5 3294 mov bl,[si+1] 3295 call BytePrintS 3296 mov al,')' 3297 ScreenIOservice _SYMBPRINT 3298 ret 3299 3300 PJ7C: call PrintWORD 3301 mov al,'(' 3302 ScreenIOservice _SYMBPRINT 3303 mov al,8 3304 mov bx,[si+1] 3305 call WordPrintS 3306 mov al,',' 3307 ScreenIOservice _SYMBPRINT 3308 mov al,'X' 3309 ScreenIOservice _SYMBPRINT 3310 mov al,')' 3311 ScreenIOservice _SYMBPRINT 3312 ret 3313 3314 3315 ; -- Show address at up-rt corner ------ 3316 ; Entry: 3317 ; BX = Address to show at the up-right 3318 ; CF = Show (0) or not (1) the contain of address in BX 3319 ; SC_ShowAdr? = Show (1-default) or not (0) the address in BX 3320 3321 SC_Clear db 1,7,' ',0 3322 SC_ShowAdr? db ? 3323 SC_Length db ? 3324 ShowCalc: mov cs:ScreenIOparams.SP_BufFlag,0 3325 push ax cx dx bx 3326 gotoxy 2,18h 3327 mov bx,offset SC_Clear 3328 jnc SC_1 3329 cmp byte ptr cs:CalcFlag,0 3330 jz SC_ret 3331 ScreenIOservice _STRINGPRINT 3332 jmp SC_ret 3333 SC_1: cmp byte ptr cs:CalcFlag,0 3334 jz SC_ret 3335 ScreenIOservice _STRINGPRINT 3336 pop bx 3337 push bx 3338 gotoxy 2,18h 3339 mov ah,3 3340 cmp byte ptr SC_ShowAdr?,0 3341 jz SC_NoAdr 3342 mov al,bh 3343 ScreenIOservice _BYTEPRINT 3344 mov al,bl 3345 ScreenIOservice _BYTEPRINT 3346 mov al,':' 3347 ScreenIOservice _SYMBPRINT 3348 SC_NoAdr: gotoxy 2,1Dh 3349 mov al,[bx] 3350 ScreenIOservice _BYTEPRINT 3351 SC_ret: pop bx dx cx ax 3352 ret 3353 3354 ; -------------------------------------------------------------------------- 3355 ; - SHOW REGS 3356 3357 SR_Str db ' ÚRegistersÄ¿ ',0 3358 db ' ³ ³ ',0 3359 db ' ÀÄÄÄÄÄÄÄÄÄÄÙ ',0 3360 SR_StrA db 1,7,'A = ',0 3361 SR_StrX db 1,7,'X = ',0 3362 SR_StrY db 1,7,'Y = ',0 3363 SR_StrP db 1,7,'P = ',0 3364 SR_StrS db 1,7,'S = ',0 3365 SR_StrPC db 1,7,'PC= ',0 3366 RegStruc struc 3367 A db ? 3368 X db ? 3369 Y db ? 3370 S db ? 3371 P db ? 3372 PC dw ? 3373 RegStruc ends 3374 Regs RegStruc <0,0,0,0,0,0> 3375 FlagSymbs db 'NVúBDIZC' 3376 3377 ShowRegs: push ax bx cx dx 3378 gotoxy 1,21h 3379 mov bx,offset SR_Str 3380 mov dx,90Dh 3381 mov ax,0000000000000100b 3382 call DrawBox 3383 mov ah,0Bh 3384 gotoxy 4,24h 3385 mov bx,offset SR_StrA 3386 ScreenIOservice _STRINGPRINT 3387 mov al,cs:Regs.A 3388 ScreenIOservice _BYTEPRINT 3389 mov ah,0Bh 3390 gotoxy 5,24h 3391 mov bx,offset SR_StrX 3392 ScreenIOservice _STRINGPRINT 3393 mov al,cs:Regs.X 3394 ScreenIOservice _BYTEPRINT 3395 mov ah,0Bh 3396 gotoxy 6,24h 3397 mov bx,offset SR_StrY 3398 ScreenIOservice _STRINGPRINT 3399 mov al,cs:Regs.Y 3400 ScreenIOservice _BYTEPRINT 3401 mov ah,0Bh 3402 gotoxy 7,24h 3403 mov bx,offset SR_StrP 3404 ScreenIOservice _STRINGPRINT 3405 mov al,cs:Regs.P 3406 ScreenIOservice _BYTEPRINT 3407 mov ah,0Bh 3408 gotoxy 8,24h 3409 mov bx,offset SR_StrS 3410 ScreenIOservice _STRINGPRINT 3411 mov al,cs:Regs.S 3412 ScreenIOservice _BYTEPRINT 3413 gotoxy 9,24h 3414 mov bx,offset SR_StrPC 3415 ScreenIOservice _STRINGPRINT 3416 mov al,byte ptr cs:Regs.PC[1] 3417 ScreenIOservice _BYTEPRINT 3418 mov al,byte ptr cs:Regs.PC 3419 ScreenIOservice _BYTEPRINT 3420 mov ah,0Bh 3421 mov dl,cs:Regs.P 3422 xor bx,bx 3423 gotoxy 3,24h 3424 FlagsLoop0: mov ah,3 3425 shl dl,1 3426 jnc ClearFlag 3427 mov ah,0Bh 3428 ClearFlag: mov al,cs:FlagSymbs[bx] 3429 ScreenIOservice _SYMBPRINT 3430 inc bx 3431 cmp bx,8 3432 jb FlagsLoop0 3433 gotoxy 1,23h 3434 mov ax,0E00h+'R' 3435 cmp cs:FkeysMainFlag,0 3436 jz SR_Ret 3437 ScreenIOservice _SYMBPRINT 3438 SR_Ret: pop dx cx bx ax 3439 ret 3440 3441 ; -------------------------------------------------------------------------- 3442 ; - SHOW STACK 3443 3444 SS_Str db ' ÚStackÄÄÄÄÄ¿ ',0 3445 db ' ³ ³ ',0 3446 db ' ÀÄÄÄÄÄÄÄÄÄÄÙ ',0 3447 SS_1 db '+1: ',0 3448 SS_3 db '+3: ',0 3449 SS_5 db '+5: ',0 3450 SS_7 db '+7: ',0 3451 SS_StoreCX dw ? 3452 ShowStack: push ax bx cx dx si 3453 gotoxy 0Bh,21h 3454 mov bx,offset SS_Str 3455 mov dx,60Dh 3456 mov ax,0000000000001000b 3457 call DrawBox 3458 mov bx,101h 3459 add bl,cs:Regs.S 3460 mov si,offset SS_1 3461 gotoxy 0Dh,24h 3462 mov cs:SS_StoreCX,cx 3463 mov dx,4 3464 SS_Loop1: mov ah,7 3465 xchg bx,si 3466 ScreenIOservice _STRINGPRINT 3467 add bx,5 3468 xchg si,bx 3469 mov ah,3 3470 inc bl 3471 mov al,ds:[bx] 3472 ScreenIOservice _BYTEPRINT 3473 dec bl 3474 mov al,ds:[bx] 3475 ScreenIOservice _BYTEPRINT 3476 add bl,2 3477 add cs:SS_StoreCX,80 * 2 3478 mov cx,cs:SS_StoreCX 3479 dec dx 3480 jnz SS_Loop1 3481 pop si dx cx bx ax 3482 ret 3483 3484 ; -------------------------------------------------------------------------- 3485 ; - SHOW BREAKS 3486 3487 SB_Str db 'ÚBreakpointsÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0 3488 db '³ ³',0 3489 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0 3490 Breakpoint struc 3491 BP_Address dw ? 3492 BP_ByteStorage db ? 3493 BP_ActiveFlag db ? 3494 BP_FlashFlag db ? 3495 BP_PrintXY dw ? 3496 ends 3497 3498 BreakPoints Breakpoint <0,?,0,0,?> 3499 Breakpoint <0,?,0,0,2*80*2+49*2> 3500 Breakpoint <0,?,0,0,3*80*2+49*2> 3501 Breakpoint <0,?,0,0,4*80*2+49*2> 3502 Breakpoint <0,?,0,0,2*80*2+64*2> 3503 Breakpoint <0,?,0,0,3*80*2+64*2> 3504 Breakpoint <0,?,0,0,4*80*2+64*2> 3505 3506 ShowBreaks: push ax bx cx dx si 3507 gotoxy 1,2Fh 3508 mov bx,offset SB_Str 3509 mov dx,522h 3510 mov ax,0000000000010000b 3511 call DrawBox 3512 mov si,7 3513 mov dx,600h 3514 SB_Loop: mov ah,7 3515 test cs:Breakpoints[si].BP_ActiveFlag,1 3516 jz SB_ok1 3517 mov ah,0Ch 3518 test cs:Breakpoints[si].BP_FlashFlag,1 3519 jz SB_ok1 3520 mov ah,8Ch 3521 mov cs:Breakpoints[si].BP_FlashFlag,0 3522 SB_ok1: mov cx,cs:Breakpoints[si].BP_PrintXY 3523 mov al,'B' 3524 ScreenIOservice _SYMBPRINT 3525 mov al,dl 3526 add al,'0'+1 3527 ScreenIOservice _SYMBPRINT 3528 mov ax,700h+':' 3529 ScreenIOservice _SYMBPRINT 3530 add cx,2 3531 mov bx,cs:Breakpoints[si].BP_Address 3532 mov ax,30Ah 3533 call WordPrintS 3534 inc dl 3535 add si,7 3536 dec dh 3537 jnz SB_Loop 3538 pop si dx cx bx ax 3539 ret 3540 3541 ; -------------------------------------------------------------------------- 3542 ; - SHOW DUMP A 3543 3544 SDA_Str db 'ÚMemory Dump BÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0 3545 db '³ ³',0 3546 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0 3547 SDA_NumStr db '0123456789ABCDEF' 3548 SDA_Address dw 0 3549 SDA_StoreCX dw ? 3550 ShowDumpA: push ax bx cx dx si 3551 gotoxy 7,2Fh 3552 mov bx,offset SDA_Str 3553 mov dx,0A22h 3554 mov ax,0000000000100000b 3555 call DrawBox 3556 mov bx,cs:SDA_Address 3557 and bx,000Fh 3558 gotoxy 8,38h 3559 mov dl,8 3560 mov ah,7 3561 SDA_NumbLoop: mov al,cs:SDA_NumStr[bx] 3562 ScreenIOservice _SYMBPRINT 3563 inc bx 3564 and bx,0Fh 3565 add cx,4 3566 dec dl 3567 jnz SDA_NumbLoop 3568 gotoxy 9,31h 3569 mov SDA_StoreCX,cx 3570 mov bx,cs:SDA_Address 3571 xor si,si 3572 mov dh,8 3573 SDA_Loop0: mov ah,7 3574 mov al,bh 3575 ScreenIOservice _BYTEPRINT 3576 mov al,bl 3577 ScreenIOservice _BYTEPRINT 3578 mov al,':' 3579 ScreenIOservice _SYMBPRINT 3580 mov dl,8 3581 SDA_Loop1: add cx,2 3582 mov al,ds:[bx] 3583 cmp al,cs:BufferA[si] 3584 ; mov cs:BufferA[si],al 3585 mov ah,0Bh 3586 jne SDA_NotSame 3587 mov ah,3 3588 SDA_NotSame: ScreenIOservice _BYTEPRINT 3589 inc bx 3590 inc si 3591 dec dl 3592 jnz SDA_Loop1 3593 add cs:SDA_StoreCX,80 * 2 3594 mov cx,cs:SDA_StoreCX 3595 dec dh 3596 jnz SDA_Loop0 3597 cmp cs:EB_Flag,0 3598 jz SDA_Ret 3599 cmp cs:FkeysMainFlag,0 3600 jz SDA_Ret 3601 gotoxy 7,30h 3602 mov ax,0E00h+'M' 3603 ScreenIOservice _SYMBPRINT 3604 SDA_Ret: pop si dx cx bx ax 3605 ret 3606 3607 ; -------------------------------------------------------------------------- 3608 ; - SHOW DUMP B 3609 3610 SDB_Str db 'ÚMemory Dump AÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0 3611 db '³ ³',0 3612 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0 3613 SDB_NumStr db '0123456789ABCDEF' 3614 SDB_Address dw 0 3615 SDB_Count1 db ? 3616 SDB_1: add cx,2 3617 add di,2 3618 jmp SDB_1_ret 3619 ShowDumpB: push ax bx cx dx si di 3620 gotoxy 12h,00h 3621 mov bx,offset SDB_Str 3622 mov dx,651h 3623 mov ax,0000000001000000b 3624 call DrawBox 3625 mov bx,cs:SDB_Address 3626 and bx,000Fh 3627 gotoxy 13h,3Dh 3628 mov di,cx 3629 gotoxy 13h,0Ah 3630 mov dx,10h 3631 mov si,8 3632 mov ah,7 3633 SDB_NumbLoop: mov al,cs:SDB_NumStr[bx] 3634 ScreenIOservice _SYMBPRINT 3635 add cx,4 3636 xchg di,cx 3637 ScreenIOservice _SYMBPRINT 3638 xchg di,cx 3639 dec si 3640 jz SDB_1 3641 SDB_1_ret: inc bx 3642 and bx,0Fh 3643 dec dx 3644 jnz SDB_NumbLoop 3645 gotoxy 14h,3Dh 3646 mov dx,cx 3647 gotoxy 14h,2 3648 mov si,cs:SDB_Address 3649 xor di,di 3650 mov cs:SDB_Count1,4 3651 SDB_Loop0: mov ah,7 3652 mov bx,si 3653 mov al,bh 3654 ScreenIOservice _BYTEPRINT 3655 mov al,bl 3656 ScreenIOservice _BYTEPRINT 3657 mov al,':' 3658 ScreenIOservice _SYMBPRINT 3659 add cx,4 3660 mov bx,1008h 3661 SDB_Loop1: mov al,ds:[si] 3662 cmp al,cs:BufferB[di] 3663 ; mov cs:BufferB[di],al 3664 mov ah,0Bh 3665 jne SDB_NotSame 3666 mov ah,3 3667 SDB_NotSame: ScreenIOservice _BYTEPRINT 3668 xchg cx,dx 3669 xor ah,ah 3670 xchg di,ax 3671 shl di,1 3672 mov bp,ss:TextChars[di] 3673 xchg di,ax 3674 mov ax,bp 3675 ScreenIOservice _SYMBPRINT 3676 xchg cx,dx 3677 add cx,2 3678 dec bl 3679 jz SDB_2 3680 SDB_2_ret: inc si 3681 inc di 3682 dec bh 3683 jnz SDB_Loop1 3684 add cx,24*2 3685 add dx,63*2 3686 dec cs:SDB_Count1 3687 jnz SDB_Loop0 3688 cmp cs:EB_Flag,0 3689 jnz SDB_Ret 3690 cmp cs:FkeysMainFlag,0 3691 jz SDB_Ret 3692 gotoxy 12h,1 3693 mov ax,0E00h+'M' 3694 ScreenIOservice _SYMBPRINT 3695 SDB_Ret: pop di si dx cx bx ax 3696 ret 3697 SDB_2: add cx,2 3698 add dx,2 3699 jmp SDB_2_ret 3700 3701 ; -------------------------------------------------------------------------- 3702 ; - SHOW FUNCTION KEYS 3703 3704 SFK_None db ' ',0 3705 SFK_Cont db 'Apple ',0 3706 SFK_Animat db 'Animat',0 3707 SFK_Trace db 'Trace ',0 3708 SFK_Step db 'Step ',0 3709 SFK_GoTo db 'Run to',0 3710 SFK_GoToRTS db 'To RTS',0 3711 SFK_View db 'View ',0 3712 SFK_HelpON db 'Help ',0 3713 SFK_HelpOFF db 'CloseH',0 3714 SFK_HelpUp db 'Help ',0 3715 SFK_HelpDown db 'Help ',0 3716 SFK_Stop db 'Stop ',0 3717 3718 SFK_Str db '1 2 3 4 5 ' 3719 db '6 7 8 9 10 ',0 3720 3721 FkeyStruc struc 3722 FkeyFlag db ? 3723 FkeyLabel dw ? 3724 FkeyProc dw ? 3725 FkeyStruc ends 3726 FkeysMainFlag db 1 3727 FkeysBuffer FkeyStruc <1, SFK_Cont, GK_Cont > 3728 FkeyStruc <1, SFK_Animat, GK_Animat > 3729 FkeyStruc <1, SFK_Step, GK_Step > 3730 FkeyStruc <1, SFK_Trace, GK_Trace > 3731 FkeyStruc <1, SFK_GoTo, GK_GoTo > 3732 FkeyStruc <1, SFK_GoToRTS, GK_ToRTS > 3733 FkeyStruc <1, SFK_View, GK_View > 3734 FkeyStruc <0, SFK_HelpUp, GK_HelpUp > 3735 FkeyStruc <0, SFK_HelpDown, GK_HelpDown> 3736 FkeyStruc <1, SFK_HelpOn, GK_Help > 3737 3738 ShowFuncKeys: push ax bx cx dx si di 3739 gotoxy 19h,0 3740 mov bx,offset SFK_Str 3741 mov ah,7 3742 ScreenIOservice _STRINGPRINT 3743 gotoxy 19h,1 3744 xor si,si 3745 mov di,10 3746 mov dx,484Fh 3747 cmp cs:FkeysMainFlag,0 3748 jnz SFK_Loop 3749 mov dx,4848h 3750 SFK_Loop: mov bx,cs:FkeysBuffer[si].FkeyLabel 3751 mov ah,dh 3752 cmp cs:FkeysBuffer[si].FkeyFlag,0 3753 jz SFK_ok1 3754 mov ah,dl 3755 SFK_ok1: ScreenIOservice _STRINGPRINT 3756 add cx,4 3757 add si,size FkeyStruc 3758 dec di 3759 jnz SFK_Loop 3760 pop di si dx cx bx ax 3761 ret 3762 3763 ; -------------------------------------------------------------------------- 3764 ; - SHOW HELP 3765 3766 SH_CX dw 376h 3767 HelpFlag db 0 3768 HelpAddr dw ? 3769 HelpPtr dw ? 3770 MinHelpPtr dw ? 3771 MaxHelpPtr dw ? 3772 SH_Str db 'ÚHelpÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿',0 3773 db '³ ³',0 3774 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0 3775 Helps label byte 3776 db ' ',0 3777 3778 SH_MoveHelp db ' ',0,' ',0,' ',0 3779 db 1,7,' Use <',1,0Fh,'',1,7,'> keys to move Help',0 3780 db ' ',0 3781 db 1,7,' Press <',1,0Fh,'Enter',1,7,'> when done ',0,0 3782 3783 SH_ComHelp0 db 'Supported Commands List:',0 3784 db ' ',0 3785 db 'REGS',1,7,' -edit registers',0 3786 db ' =',1,7,' -change register',0 3787 db ' ',0 3788 db 'D ',1,7,' -disassemble',0 3789 db 'DA ',1,7,' -dump A',0 3790 db 'DB ',1,7,' -dump B',0 3791 db 'ASM []',1,7,' -assembler mode',0 3792 db 'EA []',1,7,' -edit dump A',0 3793 db 'EB []',1,7,' -edit dump B',0 3794 db ' ',0 3795 db '[ ,]',1,7,' -set {margins}',0 3796 db 'FIND [,..][''st'',..]["st",..]',0 3797 db 1,7,' -find string in {margins}',0 3798 db 'COPY ',1,7,' -copy {margins}',0 3799 db 'COMP ',1,7,' -compare {margins}',0 3800 db 'PDUMP []',0 3801 db 1,7,' -Print Memory Dump',0 3802 db 'PASM []',0 3803 db 1,7,' -Print Disassembled Dump',0 3804 db ' ',0 3805 db 'BREAK<1..6>=',1,7,' -set breakpoint',0 3806 db 'GO [][,]',1,7,' -execute',0 3807 db ' ',0 3808 db '. =',0 3809 db 1,7,' -define label',0 3810 db 'LIST',1,7,' -defined labels list',0 3811 db 'DL ',1,7,' -delete label',0 3812 db 'LAB |',1,7,' -labels activity',0 3813 db 'LL ',1,7,' -load labels',0 3814 db 'SL ',1,7,' -save labels',0 3815 db ' ',0 3816 3817 db 'RECORD [f]',1,7,' macro',0 3818 db 'STOP',1,7,' -stop recording',0 3819 db 'PLAY []',1,7,' -play macro',0 3820 db 'LM ',1,7,' -load macro',0 3821 db 'SM ',1,7,' -save macro',0 3822 db ' ',0 3823 3824 db '? [,h][,d][,b]',0 3825 db 1,7,' -evaluate expression',0 3826 db 'SWAP ',1,7,' -scr swapping',0 3827 db 'SOUND |',0 3828 db 'RESET',1,7,' -cold reset APPLE',0 3829 3830 db 'Assembler Mode',0 3831 db ' ',0 3832 db 1,7,'Enter 65C02 statements,<',1,0Fh,'Esc',1,7,'> Exit',0 3833 db ' ',0 3834 db 'Examples:',0 3835 db 1,7,' LDA (77),Y ',0 3836 db 1,7,' BIT C000',0 3837 db 1,7,' BPL 17FF',0,0 3838 3839 db 'Memory Dump B Editor',0 3840 db ' ',0 3841 db 1,7,'Enter hex numbers, <',1,0Fh,'Esc',1,7,'> Exit',0 3842 db ' ',0 3843 db 1,7,'Use "',1,0Fh,'EB ',1,7,'" command to change',0 3844 db 1,7,'dump address',0,0 3845 3846 db 'Memory Dump A Editor',0 3847 db ' ',0 3848 db 1,7,'Enter hex numbers or chars.',0 3849 db 1,7,'Press <',1,0Fh,'Tab',1,7,'> to swap entry area.',0 3850 db 1,7,'Use "',1,0Fh,'EA ',1,7,'" command to change',0 3851 db 1,7,'dump address',0 3852 db ' ',0 3853 db 1,7,'Press <',1,0Fh,'Esc',1,7,'> to Exit',0,0 3854 3855 db 'Registers Editor',0 3856 db ' ',0 3857 db 1,7,'Select register with <',1,0Fh,'',1,7,'>, then',0 3858 db 1,7,'enter hexadecimal value or press',0 3859 db 1,7,'<',1,0Fh,'Space',1,7,'> to flip a flag.',0 3860 db ' ',0 3861 db 1,7,'Press <',1,0Fh,'Esc',1,7,'> to Exit.',0,0 3862 3863 db 'View Labels',0 3864 db ' ',0 3865 db 1,7,'Use <',1,0Fh,'',1,7,'>,<',1,0Fh,'PgUp',1,7,'>,<',1,0Fh,'PgDn',1,7,'> to move.',0 3866 db ' ',0 3867 db 1,7,'Press <',1,0Fh,'Esc',1,7,'> to Exit.',0,0 3868 3869 ShowHelp: test cs:HelpFlag,1 3870 jz SH_Ret 3871 push ax bx cx dx 3872 mov cx,cs:SH_CX 3873 mov bx,offset SH_Str 3874 mov dx,0C26h 3875 mov ax,0000000010000000b 3876 call DrawBox 3877 SH_ok: mov bx,cs:HelpAddr 3878 mov dx,cs:SH_CX 3879 add dx,(80*2*2)+4 3880 mov al,10 3881 SH_Loop: mov cx,dx 3882 add dx,80*2 3883 mov ah,0Fh 3884 ScreenIOservice _STRINGPRINT 3885 mov bx,cs:ScreenIOparams.SP_bx 3886 cmp byte ptr cs:[bx],0 3887 jz SH_Ret0 3888 dec al 3889 jnz SH_Loop 3890 SH_Ret0: mov cx,cs:SH_CX 3891 add cx,2 3892 mov ax,0E00h+'H' 3893 cmp cs:FkeysMainFlag,0 3894 jz SH_Ret1 3895 ScreenIOservice _SYMBPRINT 3896 SH_Ret1: pop dx cx bx ax 3897 SH_Ret: ret 3898 3899 3900 SH_Calculate: push bx dx 3901 mov bx,offset Helps 3902 mov dx,cs:HelpPtr 3903 SH_Loop0: cmp byte ptr cs:[bx],0 3904 jz SH_EOL 3905 inc bx 3906 jmp SH_Loop0 3907 SH_EOL: inc bx 3908 dec dx 3909 jnz SH_Loop0 3910 mov cs:HelpAddr,bx 3911 pop dx bx 3912 ret 3913 3914 SH_Choose: mov cs:HelpPtr,ax 3915 mov cs:MinHelpPtr,ax 3916 mov cs:MaxHelpPtr,bx 3917 call SH_Calculate 3918 ret 3919 3920 ; -------------------------------------------------------------------------- 3921 ; - SHOW LABS 3922 3923 SL_Flag db 0 3924 SL_Ptr dw 0 3925 SL_CX dw ? 3926 SL_Str db 'ÚDefined Labels ListÄÄÄÄÄÄÄ¿',0 3927 db '³ ³',0 3928 db 'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ',0 3929 ShowLabels: test cs:SL_Flag,1 3930 jz SL_Ret 3931 push ax bx cx dx si di 3932 gotoxy 7,12 3933 mov bx,offset SL_Str 3934 mov dx,0C1Dh 3935 mov ax,0000000100000000b 3936 call DrawBox 3937 mov di,10 3938 mov bx,SL_Ptr 3939 mov si,bx 3940 shl si,1 3941 mov dx,19 3942 gotoxy 9,14 3943 mov cs:SL_CX,cx 3944 SL_Loop: mov cx,cs:SL_CX 3945 call PrintSymbol 3946 mov cx,cs:SL_CX 3947 add cs:SL_CX,80*2 3948 add cx,20 * 2 3949 mov ah,3 3950 mov al,byte ptr cs:SymbVal[si+1] 3951 ScreenIOservice _BYTEPRINT 3952 mov al,byte ptr cs:SymbVal[si] 3953 ScreenIOservice _BYTEPRINT 3954 add si,2 3955 inc bx 3956 cmp bx,cs:SymbValPtr 3957 jae SL_Ret1 3958 dec di 3959 jnz SL_Loop 3960 SL_Ret1: pop di si dx cx bx ax 3961 SL_Ret: ret 3962 ; -------------------------------------------------------------------------- 3963 3964 3965 3966 ; ******************************************************************* 3967 ; ** ** 3968 ; ** ** 3969 ; ** P R I N T S E R V I C E S ** 3970 ; ** ** 3971 ; ** ** 3972 ; ******************************************************************* 3973 3974 WordPrintS: push ax bx 3975 call WordPrint 3976 jnc WPS_ret 3977 mov al,bh 3978 ScreenIOservice _BYTEPRINT 3979 mov al,bl 3980 ScreenIOservice _BYTEPRINT 3981 WPS_ret: pop bx ax 3982 ret 3983 3984 3985 3986 BYTEPRINTS: push ax bx 3987 xor bh,bh 3988 call WordPrint 3989 jnc BPS_ret 3990 mov al,bl 3991 ScreenIOservice _BYTEPRINT 3992 BPS_ret: pop bx ax 3993 ret 3994 3995 3996 3997 WordPrintFl db 1 3998 WP_al db ? 3999 4000 WordPrint: push ax bx dx di es cx ; Print a word 4001 push cs 4002 pop es ; Input: 4003 test byte ptr cs:WordPrintFl,1 ; BX-word to print 4004 jz WP_1 ; AH-attr, CL-htab, CH-vtab 4005 mov di,offset SymbVal ; AL-length 4006 cld 4007 mov cx,cs:SymbValPtr 4008 cmp cx,0 4009 jz WP_1 4010 push ax 4011 mov ax,bx 4012 repne scasw 4013 pop ax 4014 jne WP_1 4015 sub di,offset SymbVal + 2 4016 mov bx,di 4017 shr bx,1 4018 pop cx 4019 xor dx,dx 4020 mov dl,al 4021 mov cs:WP_al,al 4022 call PrintSymbol 4023 clc 4024 jmp WP_ret 4025 4026 WP_1: stc 4027 pop cx 4028 WP_ret: pop es di dx bx ax 4029 ret 4030 4031 4032 4033 ; ******************************************************************* 4034 ; ** ** 4035 ; ** ** 4036 ; ** G E T A D D R E S S ** 4037 ; ** ** 4038 ; ** ** 4039 ; ******************************************************************* 4040 4041 GAdd_Oper db '+-*/|^&<>' 4042 GAdd_DoOper dw GA_Plus,GA_Minus,GA_Multiply,GA_Divide 4043 dw GA_Or,GA_Xor,GA_And,GA_Shl,GA_Shr 4044 GAdd_cx dw ? 4045 4046 GetAddress: push bx dx di 4047 call GetAdr 4048 jc GAdd_Error 4049 GAdd_0: mov bx,ax 4050 GetLineService _GL_GetSymb 4051 push cx 4052 mov di,offset GAdd_Oper 4053 mov cx,offset GAdd_DoOper - offset GAdd_Oper 4054 call CalcCommand 4055 pop cx 4056 jnc GAdd_1 4057 mov ax,bx 4058 pop di dx bx 4059 ret 4060 4061 GAdd_Error: pop di dx bx ax 4062 ret 4063 4064 GAdd_1: mov cs:GAdd_cx,cx 4065 call GetAdr 4066 jc GAdd_Error 4067 shl di,1 4068 xchg ax,bx 4069 call word ptr cs:GAdd_DoOper[di] 4070 jc GAdd_0 4071 mov cs:GetKeyParams.RK_ErrPtr,0 4072 jmp GAdd_0 4073 4074 GA_Plus: add ax,bx 4075 mov cs:GetKeyParams.RK_ErrPtr,offset GA_PlusMes 4076 ret 4077 4078 GA_Minus: sub ax,bx 4079 mov cs:GetKeyParams.RK_ErrPtr,offset GA_MinusMes 4080 ret 4081 4082 GA_Multiply: mul bx 4083 mov cs:GetKeyParams.RK_ErrPtr,offset GA_MulMes 4084 ret 4085 4086 GA_Divide: push dx 4087 xor dx,dx 4088 cmp bx,0 4089 jz GA_ZeroDiv 4090 cmp ax,bx 4091 jb GA_DivRet 4092 GA_DivLoop: sub ax,bx 4093 jc GA_DivOk 4094 inc dx 4095 jmp GA_DivLoop 4096 GA_DivOk: add ax,bx 4097 or ax,ax 4098 clc 4099 jz GA_DivRet 4100 4101 push dx 4102 mov dx,ax 4103 mov bx,3 4104 GA_DivLoop00: mov al,dl 4105 shr dx,4 4106 and al,0Fh 4107 cmp al,0Ah 4108 cmc 4109 adc al,30h 4110 daa 4111 mov cs:GA_DivRest[bx],al 4112 dec bx 4113 jns GA_DivLoop00 4114 pop dx 4115 stc 4116 mov cs:GetKeyParams.RK_ErrPtr,offset GA_DivMes 4117 4118 GA_DivRet: mov ax,dx 4119 pop dx 4120 ret 4121 4122 GA_ZeroDiv: mov cs:GetKeyParams.RK_ErrPtr,offset ZeroDivMes 4123 pop dx di 4124 mov cx,cs:GAdd_cx 4125 inc cl 4126 jmp GAdd_Error 4127 4128 GA_Or: or ax,bx 4129 clc 4130 ret 4131 4132 GA_Xor: xor ax,bx 4133 clc 4134 ret 4135 4136 GA_And: and ax,bx 4137 clc 4138 ret 4139 4140 GA_Shl: push cx 4141 mov cl,bl 4142 shl ax,cl 4143 pop cx 4144 ret 4145 4146 GA_Shr: push cx 4147 mov cl,bl 4148 shr ax,cl 4149 pop cx 4150 clc 4151 ret 4152 4153 4154 4155 Delimiters_C = 19 4156 Delimiters db '{[()]}/,=+-*/|^&<>',0 4157 GAd_Sym db 'rxysp.%@' 4158 GAd_Sub dw GAd_A, GAd_X, GAd_Y, GAd_S, GAd_P 4159 dw GAd_Label, GAd_Bin, GAd_Dec, GAd_Hex 4160 GAd_Flag db ? 4161 4162 GetAdr: push bx di cx 4163 GetLineService _GL_GetSymb 4164 mov di,offset GAd_Sym 4165 mov cx,offset GAd_Sub - offset GAd_Sym 4166 call CalcCommand 4167 pop cx 4168 jnc GAd_NotHex 4169 mov di,8 4170 GAd_NotHex: shl di,1 4171 call word ptr cs:GAd_Sub[di] 4172 jc GAd_Ret 4173 dec cl 4174 mov ax,bx 4175 mov cs:GetKeyParams.RK_ErrPtr,0 4176 clc 4177 4178 GAd_Ret: pop di bx 4179 ret 4180 4181 4182 GAd_A: xor bx,bx 4183 mov bl,cs:Regs.A 4184 GetLineService _GL_GetSymb 4185 GetLineService _GL_GetSymb 4186 ret 4187 4188 GAd_X: xor bx,bx 4189 mov bl,cs:Regs.X 4190 GetLineService _GL_GetSymb 4191 GetLineService _GL_GetSymb 4192 ret 4193 4194 GAd_Y: xor bx,bx 4195 mov bl,cs:Regs.Y 4196 GetLineService _GL_GetSymb 4197 GetLineService _GL_GetSymb 4198 ret 4199 4200 GAd_S: xor bx,bx 4201 mov bl,cs:Regs.S 4202 GetLineService _GL_GetSymb 4203 GetLineService _GL_GetSymb 4204 ret 4205 4206 GAd_P: GetLineService _GL_GetSymb 4207 GetLineService _GL_GetSymb 4208 call Upcase 4209 cmp al,'c' 4210 je Gad_PC 4211 xor bx,bx 4212 mov bl,cs:Regs.P 4213 ret 4214 4215 GAd_PC: mov bx,cs:Regs.PC 4216 GetLineService _GL_GetSymb 4217 ret 4218 4219 4220 GAd_Label: GetLineService _GL_GetSymb 4221 call SymbGetVal 4222 jc GAd_Lerror 4223 mov cx,cs:SGV_cx 4224 mov bx,ax 4225 inc cl 4226 clc 4227 ret 4228 GAd_Lerror: inc cl 4229 stc 4230 ret 4231 4232 GAd_Hex: mov byte ptr cs:GAd_Flag,0 4233 xor bx,bx 4234 GetLoop0: GetLineService _GL_GetSymb 4235 push cx 4236 mov di,offset Delimiters 4237 mov cx,Delimiters_C 4238 call CalcCommand 4239 pop cx 4240 jnc GAd_Hret 4241 call Upcase 4242 cmp al,'0' 4243 jb GAd_Herror 4244 cmp al,'9' 4245 jbe Anumb 4246 cmp al,'a' 4247 jb GAd_Herror 4248 cmp al,'f' 4249 ja GAd_Herror 4250 sub al,27h 4251 Anumb: sub al,'0' 4252 OkNum: shl bx,1 4253 jc GAd_Oj 4254 shl bx,1 4255 jc GAd_Oj 4256 shl bx,1 4257 jc GAd_Oj 4258 shl bx,1 4259 jc GAd_Oj 4260 or bl,al 4261 mov byte ptr cs:GAd_Flag,1 4262 jmp GetLoop0 4263 4264 GAd_Hret: test byte ptr cs:GAd_Flag,1 4265 jz GAd_Nj 4266 clc 4267 ret 4268 4269 GAd_Herror: mov cs:GetKeyParams.RK_ErrPtr,offset NotHexMes 4270 stc 4271 ret 4272 4273 GAd_Oj: jmp GAd_Overflow 4274 4275 GAd_Nj: jmp GAd_NumbMiss 4276 4277 4278 GAd_Bin: mov byte ptr cs:GAd_Flag,0 4279 GetLineService _GL_GetSymb 4280 xor bx,bx 4281 GetLoop1: GetLineService _GL_GetSymb 4282 push cx 4283 mov di,offset Delimiters 4284 mov cx,Delimiters_C 4285 call CalcCommand 4286 pop cx 4287 jnc GAd_Bret 4288 sub al,'0' 4289 cmp al,1 4290 ja GAd_Berror 4291 shl bx,1 4292 jc GAd_Overflow 4293 or bl,al 4294 mov byte ptr cs:GAd_Flag,1 4295 jmp GetLoop1 4296 4297 GAd_Bret: test byte ptr cs:GAd_Flag,1 4298 jz GAd_NumbMiss 4299 clc 4300 ret 4301 4302 GAd_Berror: mov cs:GetKeyParams.RK_ErrPtr,offset NotBinMes 4303 stc 4304 ret 4305 4306 4307 4308 GAd_Dec: mov byte ptr cs:GAd_Flag,0 4309 GetLineService _GL_GetSymb 4310 xor bx,bx 4311 GetLoop2: GetLineService _GL_GetSymb 4312 push cx 4313 mov di,offset Delimiters 4314 mov cx,Delimiters_C 4315 call CalcCommand 4316 pop cx 4317 jnc GAd_Dret 4318 sub al,'0' 4319 cmp al,9 4320 ja GAd_Derror 4321 push ax 4322 mov ax,10 4323 mul bx 4324 mov bx,ax 4325 pop ax 4326 jc GAd_Overflow 4327 mov ah,0 4328 add bx,ax 4329 jc GAd_Overflow 4330 mov byte ptr cs:GAd_Flag,1 4331 jmp GetLoop2 4332 4333 GAd_Dret: test byte ptr cs:GAd_Flag,1 4334 jz GAd_NumbMiss 4335 clc 4336 ret 4337 4338 GAd_Derror: mov cs:GetKeyParams.RK_ErrPtr,offset NotDecMes 4339 stc 4340 ret 4341 4342 4343 GAd_Overflow: mov cs:GetKeyParams.RK_ErrPtr,offset BigNumMes 4344 stc 4345 ret 4346 4347 GAd_NumbMiss: mov cs:GetKeyParams.RK_ErrPtr,offset NumbMissMes 4348 or al,al 4349 jnz Gad_NumbMiss1 4350 inc cl 4351 Gad_NumbMiss1: stc 4352 ret 4353 4354 4355 4356 ; ******************************************************************* 4357 ; ** ** 4358 ; ** ** 4359 ; ** B R E A K P O I N T S E R V I C E S ** 4360 ; ** ** 4361 ; ** ** 4362 ; ******************************************************************* 4363 4364 SetBreaks proc far 4365 push ax bx dx si ds 4366 mov ax,Apple 4367 mov ds,ax 4368 xor bx,bx 4369 mov dx,7 4370 StB_Loop1: test cs:Breakpoints[bx].BP_ActiveFlag,1 4371 jz StB_Next 4372 mov si,cs:Breakpoints[bx].BP_Address 4373 mov al,2 4374 xchg al,[si] 4375 mov cs:Breakpoints[bx].BP_ByteStorage,al 4376 StB_Next: add bx,7 4377 dec dx 4378 jnz StB_Loop1 4379 pop ds si dx bx ax 4380 ret 4381 SetBreaks endp 4382 4383 4384 UnsetBreaks proc far 4385 push ax bx dx si ds 4386 mov ax,Apple 4387 mov ds,ax 4388 mov bx,6 * 7 4389 mov dx,7 4390 UsB_Loop1: test cs:Breakpoints[bx].BP_ActiveFlag,1 4391 jz UsB_Next 4392 mov si,cs:Breakpoints[bx].BP_Address 4393 mov al,cs:Breakpoints[bx].BP_ByteStorage 4394 cmp byte ptr [si],2 4395 jne UsB_Next 4396 mov [si],al 4397 UsB_Next: sub bx,7 4398 dec dx 4399 jnz UsB_Loop1 4400 pop ds si dx bx ax 4401 ret 4402 UnsetBreaks endp 4403 4404 4405 CheckBreaks: push si 4406 mov si,cs:Regs.PC 4407 stc 4408 call CheckBreak 4409 pop si 4410 ret 4411 4412 4413 F1_or_Invalid? db ? 4414 4415 CheckBreak: push ax bx cx dx 4416 mov al,1 4417 jc CB_0 4418 xor ax,ax 4419 CB_0: xor bx,bx 4420 mov cx,bx 4421 mov dx,bx 4422 CB_Loop1: test cs:Breakpoints[bx].BP_ActiveFlag,1 4423 jz CB_1 4424 cmp si,cs:Breakpoints[bx].BP_Address 4425 jne CB_1 4426 mov cl,1 4427 or bx,bx 4428 jz CB_1 4429 or al,al 4430 jz CB_1 4431 mov cs:Breakpoints[bx].BP_FlashFlag,cl 4432 call ShowPrevIns 4433 call StopAnimate 4434 mov cs:GetKeyParams.RK_ErrPtr,offset BreakpointMes 4435 mov cs:BreakpointNum,dl 4436 add cs:BreakpointNum,30h 4437 CB_1: add bx,7 4438 inc dx 4439 cmp dx,7 4440 jne CB_Loop1 4441 cmp cl,1 4442 pop dx cx bx ax 4443 ret 4444 4445 4446 4447 ; ******************************************************************* 4448 ; ** ** 4449 ; ** ** 4450 ; ** L A B E L S S E R V I C E S ** 4451 ; ** ** 4452 ; ** ** 4453 ; ******************************************************************* 4454 4455 SGV_dx dw ? 4456 SGV_adr dw ? 4457 SGV_nameBeg dw ? 4458 SGV_nameEnd dw ? 4459 SGV_cx dw ? 4460 4461 SymbGetVal: push bx dx si di cx ; Returns value of a symbol 4462 xor dx,dx 4463 mov cs:SGV_NameBeg,dx ; Input: 4464 SGV_Loop0: GetLineService _GL_GetSymb ; CH -> vtab, CL -> htab 4465 inc dx 4466 push cx ; Output: 4467 mov di,offset Delimiters ; AX -> value 4468 mov cx,Delimiters_C ; cf -> set if not found 4469 call CalcCommand 4470 pop cx 4471 jc SGV_Loop0 4472 dec dx 4473 mov cs:SGV_dx,dx 4474 4475 xor bx,bx 4476 xor si,si 4477 SGV_Loop1: pop cx 4478 push cx 4479 mov dx,cs:SGV_dx 4480 SGV_Loop2: GetLineService _GL_GetSymb 4481 SGV_Loop3: call Upcase 4482 mov ah,al 4483 mov al,cs:SymbMem[bx] 4484 call Upcase 4485 xchg al,ah 4486 cmp al,ah 4487 jne SGV_NoOk0 4488 dec dx 4489 jnz SGV_NoOk1 4490 inc bx 4491 cmp byte ptr cs:SymbMem[bx],0 4492 jnz SGV_NoOk0 4493 shl si,1 4494 mov ax,cs:SymbVal[si] 4495 mov cs:GetKeyParams.RK_ErrPtr,0 4496 mov cs:SGV_cx,cx 4497 mov cs:SGV_adr,si 4498 mov cs:SGV_nameEnd,bx 4499 clc 4500 jmp SGV_ret 4501 4502 SGV_NoOk0: cmp byte ptr cs:SymbMem[bx],0 4503 jz SGV_Cont1 4504 inc bx 4505 jmp SGV_NoOk0 4506 SGV_Cont1: inc bx 4507 cmp bx,cs:SymbPtr 4508 ja SGV_NotFnd 4509 mov cs:SGV_NameBeg,bx 4510 inc si 4511 jmp SGV_Loop1 4512 4513 SGV_NoOk1: inc bx 4514 cmp bx,cs:SymbPtr 4515 jbe SGV_Loop2 4516 SGV_NotFnd: mov cs:GetKeyParams.RK_ErrPtr,offset SymNotFndErr 4517 stc 4518 4519 SGV_ret: pop cx di si dx bx 4520 ret 4521 4522 4523 4524 PrintSymbol: push ax bx dx di ; Print a symbol 4525 and ah,11110000b 4526 or ah,0Fh ; Input: 4527 xor di,di ; CH-vtab, CL-htab, *AH-attr 4528 test cs:ScreenIOparams.SP_BufFlag,1 ; BX-Symbol number 4529 jz PS_Ok001 ; DX-Max Length 4530 mov dx,0FFFFh 4531 mov al,'.' 4532 ScreenIOservice _SYMBPRINT 4533 PS_Ok001: cmp bx,0 4534 jz PS_Go 4535 dec di 4536 PS_Loop1: inc di 4537 cmp byte ptr cs:SymbMem[di],0 4538 jne PS_Loop1 4539 dec bx 4540 jnz PS_Loop1 4541 PS_Loop2: inc di 4542 PS_Go: mov al,cs:SymbMem[di] 4543 or al,al 4544 jz PS_ret 4545 ScreenIOservice _SYMBPRINT 4546 dec dx 4547 jnz PS_Loop2 4548 PS_ret: pop di dx bx ax 4549 ret 4550 4551 4552 4553 ; ******************************************************************* 4554 ; ** ** 4555 ; ** ** 4556 ; ** K E Y B O A R D S E R V I C E S ** 4557 ; ** ** 4558 ; ** ** 4559 ; ******************************************************************* 4560 4561 Alt_Keys db 'prcmlh' 4562 Alt_Procs dw Alt_Program,Alt_Regs,Alt_Command,Alt_Memory,Alt_Labels 4563 dw Alt_Help 4564 Alt_Key proc far 4565 push cx si di ds 4566 mov di,offset Alt_Keys 4567 mov cx,offset Alt_Procs- offset Alt_Keys 4568 call CalcCommand 4569 jc Alt_Ret 4570 shl di,1 4571 call cs:Alt_Procs[di] 4572 jc Alt_Ret 4573 mov al,0Ch 4574 Alt_Ret: pop ds di si cx 4575 ret 4576 4577 Alt_Program proc near 4578 mov cs:GoWhere?,G_MiniAsm 4579 clc 4580 ret 4581 Alt_Program endp 4582 4583 Alt_Regs proc near 4584 mov cs:GoWhere?,G_Registers 4585 clc 4586 ret 4587 Alt_Regs endp 4588 4589 Alt_Command proc near 4590 mov cs:GoWhere?,G_COMMAND_ENTRY 4591 clc 4592 ret 4593 Alt_Command endp 4594 4595 Alt_Memory proc near 4596 mov cs:GoWhere?,G_EditB 4597 mov al,cs:EB_Flag 4598 xor al,1 4599 jnz Alt_Mret 4600 mov cs:GoWhere?,G_EditA 4601 Alt_Mret: clc 4602 ret 4603 Alt_Memory endp 4604 4605 Alt_Labels proc near 4606 mov cs:GoWhere?,G_LabList 4607 clc 4608 ret 4609 Alt_Labels endp 4610 4611 Alt_Help proc near 4612 mov cs:GoWhere?,G_MoveHelp 4613 clc 4614 ret 4615 Alt_Help endp 4616 4617 Alt_Key endp 4618 4619 4620 GK_Fkey proc far 4621 push ax bx cx dx si di bp ds es 4622 push cs:ShowAllNumber 4623 push cs:ActiveFlags 4624 mov cs:ActiveFlags,0 4625 mov cs:ShowAllNumber,5 4626 mov bx,Emulate 4627 mov es,bx 4628 mov bx,Apple 4629 mov ds,bx 4630 xor bx,bx 4631 mov bl,size FkeyStruc 4632 mul bl 4633 mov bx,ax 4634 cmp cs:FkeysBuffer[bx].FkeyFlag,0 4635 jz GK_NotActive 4636 mov dx,cs:AssembAdr 4637 call cs:FkeysBuffer[bx].FkeyProc 4638 GK_NotActive: pop cs:ActiveFlags 4639 pop cs:ShowAllNumber 4640 mov cs:GetKeyParams.RK_FkeyFlag,1 4641 mov word ptr cs:GetKeyParams.RK_FkeyProc,offset GK_Fkey 4642 mov word ptr cs:GetKeyParams.RK_FkeyProc[2],seg GK_Fkey 4643 pop es ds bp di si dx cx bx ax 4644 ret 4645 GK_Fkey endp 4646 4647 4648 4649 GK_Cont: mov cs:Breakpoints.BP_ActiveFlag,0 4650 call GoAppleII0 4651 ret 4652 4653 4654 OldC050 db ? 4655 GK_Animat: xor cs:GetKeyParams.RK_WaitKeyFlag,1 4656 mov ax,100h 4657 cmp cs:GetKeyParams.RK_WaitKeyFlag,al 4658 mov bx,offset StopAnimate 4659 jz T_DoIt 4660 mov bx,offset StartAnimate 4661 T_DoIt: call bx 4662 ret 4663 4664 StartAnimate: push ax 4665 xor al,al 4666 mov cs:FkeysBuffer[1*size FkeyStruc].FkeyLabel,offset SFK_Stop 4667 mov cs:FkeysBuffer[2*size FkeyStruc].FkeyFlag,al 4668 mov cs:FkeysBuffer[3*size FkeyStruc].FkeyFlag,al 4669 mov cs:FkeysBuffer[4*size FkeyStruc].FkeyFlag,al 4670 mov cs:FkeysBuffer[5*size FkeyStruc].FkeyFlag,al 4671 mov al,C050 4672 mov cs:OldC050,al 4673 mov cs:GetKeyParams.RK_WaitKeyFlag,1 4674 pop ax 4675 ret 4676 4677 StopAnimate: push ax 4678 mov ah,1 4679 mov cs:FkeysBuffer[1*size FkeyStruc].FkeyLabel,offset SFK_Animat 4680 mov cs:FkeysBuffer[2*size FkeyStruc].FkeyFlag,ah 4681 mov cs:FkeysBuffer[3*size FkeyStruc].FkeyFlag,ah 4682 mov cs:FkeysBuffer[4*size FkeyStruc].FkeyFlag,ah 4683 mov cs:FkeysBuffer[5*size FkeyStruc].FkeyFlag,ah 4684 mov al,cs:OldC050 4685 mov es:C050,al 4686 mov cs:GetKeyParams.RK_WaitKeyFlag,0 4687 pop ax 4688 ret 4689 4690 T_WaitKey proc far 4691 push bp ds es ax 4692 mov ax,Apple 4693 mov ds,ax 4694 mov ax,Emulate 4695 mov es,ax 4696 mov al,es:C050 4697 call StepAppleII 4698 call CheckBreaks 4699 jc T_ok01 4700 cmp cs:ViewFlag,0 4701 jz t_ok01 4702 inc cs:ViewFlag 4703 mov es:C000,94h ; Press F7 to end view mode 4704 T_ok01: cmp al,es:C050 4705 je T_ok00 4706 mov al,es:C050 4707 mov cs:OldC050,al 4708 ScreenIOservice _SETTEXTMODE 4709 T_ok00: test cs:ScreenIOparams.SS_ScreenFlag,1 4710 jz T_ok10 4711 cmp cs:GetKeyParams.RK_WaitKeyFlag,0 4712 jz T_ok10 4713 call ShowAll 4714 ScreenIOservice _SHOWCURSOR 4715 T_ok10: pop ax es ds bp 4716 ret 4717 T_WaitKey endp 4718 4719 4720 GK_Step: mov cs:Regs.PC,dx 4721 mov bx,dx 4722 mov al,[bx] 4723 xor bx,bx 4724 mov bl,al 4725 xor ax,ax 4726 mov al,cs:InstrLongTbl[bx] 4727 test al,10000000b 4728 jz GK_Trace 4729 and al,00000011b 4730 add ax,cs:Regs.PC 4731 mov cs:Breakpoints.BP_ActiveFlag,1 4732 mov cs:Breakpoints.BP_Address,ax 4733 mov si,cs:Regs.PC 4734 call GoAppleII 4735 mov cs:Breakpoints.BP_ActiveFlag,0 4736 mov cs:ShowPrev?,1 4737 mov cs:PrevAdr,si 4738 ret 4739 4740 4741 GK_Trace: mov cs:Regs.PC,dx 4742 call StepAppleII 4743 call CheckBreaks 4744 ScreenIOservice _SETTEXTMODE 4745 ret 4746 4747 4748 GK_GoTo: mov cs:Breakpoints.BP_ActiveFlag,1 4749 mov cs:Breakpoints.BP_Address,dx 4750 mov si,cs:Regs.PC 4751 call GoAppleII 4752 mov cs:Breakpoints.BP_ActiveFlag,0 4753 call ShowPrevIns 4754 ret 4755 4756 GK_ToRTS: mov ax,Emulate 4757 mov es,ax 4758 xor ax,ax 4759 mov cs:FkeysMainFlag,al 4760 xchg cs:ActiveFlags,ax 4761 mov cs:GetKeyParams.RK_ErrPtr, offset ToRTSmes 4762 call ShowAll 4763 ScreenIOService _SHOWSCREEN 4764 mov cs:ActiveFlags,ax 4765 call InitBufferA 4766 call InitBufferB 4767 mov al,cs:Regs.S 4768 GK_ToRTS_loop: call StepAppleII_ 4769 ScreenIOservice _SETTEXTMODE 4770 cmp C000,0 4771 jnz GK_ToRTS_ret 4772 mov bx,cs:Regs.PC 4773 cmp byte ptr ds:[bx],60h 4774 jne GK_ToRTS_loop 4775 cmp cs:Regs.S,al 4776 jne GK_ToRTS_loop 4777 GK_ToRTS_ret: xor ax,ax 4778 mov C000,al 4779 mov cs:GetKeyParams.RK_ErrPtr,ax 4780 inc al 4781 mov cs:FkeysMainFlag,al 4782 call ShowPrevIns 4783 ret 4784 4785 4786 ViewFlag db 0 4787 GK_View: mov cs:ViewFlag,1 4788 mov al,C050 4789 mov cs:OldC050,al 4790 ScreenIOservice _SetScreen 4791 mov cs:GetKeyParams.RK_FkeyFlag,0 4792 mov cs:ScreenIOparams.SS_ScreenFlag,0 4793 US_Loop1: call ReadKey 4794 cmp cs:ViewFlag,2 4795 jne US_NotBreak 4796 mov cs:GetKeyParams.RK_ErrPtr,offset BreakpointMes 4797 US_NotBreak: cmp cs:ViewFlag,0 4798 jz US_Ret 4799 cmp al,14h 4800 je US_Ret 4801 cmp al,0Ch 4802 je US_Ret 4803 cmp al,18h 4804 je US_Quit 4805 cmp al,0Fh 4806 je US_Stop 4807 call MySetScreen 4808 jmp US_Loop1 4809 US_Ret: mov al,cs:OldC050 4810 mov C050,al 4811 US_Quit: mov cs:ScreenIOparams.SS_ScreenFlag,1 4812 mov cs:ViewFlag,0 4813 ret 4814 US_Stop: call StopAnimate 4815 jmp US_Ret 4816 4817 4818 4819 GK_Help: mov ax,100h 4820 xor cs:HelpFlag,ah 4821 jnz GK_HelpOn 4822 mov cs:FkeysBuffer[9*size FkeyStruc].FkeyLabel,offset SFK_HelpOn 4823 mov cs:FkeysBuffer[7*size FkeyStruc].FkeyFlag,al 4824 mov cs:FkeysBuffer[8*size FkeyStruc].FkeyFlag,al 4825 jmp GK_HelpRet 4826 GK_HelpOn: mov cs:FkeysBuffer[9*size FkeyStruc].FkeyLabel,offset SFK_HelpOff 4827 mov cs:FkeysBuffer[7*size FkeyStruc].FkeyFlag,ah 4828 mov cs:FkeysBuffer[8*size FkeyStruc].FkeyFlag,ah 4829 GK_HelpRet: ret 4830 4831 4832 GK_HelpUp: push ax 4833 mov ax,cs:MinHelpPtr 4834 cmp ax,cs:HelpPtr 4835 je GK_HelpUpRet 4836 dec cs:HelpPtr 4837 call SH_Calculate 4838 GK_HelpUpRet: pop ax 4839 ret 4840 4841 GK_HelpDown: push ax 4842 mov ax,cs:MaxHelpPtr 4843 cmp ax,cs:HelpPtr 4844 je GK_HelpDownRet 4845 inc cs:HelpPtr 4846 call SH_Calculate 4847 GK_HelpDownRet: pop ax 4848 ret 4849 4850 4851 GK_None: ret 4852 4853 4854 4855 ; ******************************************************************* 4856 ; ** ** 4857 ; ** ** 4858 ; ** C O M M A N D S S E R V I C E S ** 4859 ; ** ** 4860 ; ** ** 4861 ; ******************************************************************* 4862 4863 Upcase: cmp al,'A' 4864 jb UPCSret 4865 cmp al,'Z' 4866 ja UPCSret 4867 or al,20h 4868 UPCSret: ret 4869 4870 4871 4872 CalcCommand: push ax bx cx es ; Returns number of a command . 4873 push cs ; Input: 4874 pop es ; di -> offset Commands 4875 call Upcase ; al -> search command 4876 cld ; cx -> commands count 4877 mov bx,di 4878 repne scasb ; Output: 4879 stc ; di <- Number of the command 4880 jne CC_end ; cf <- 1 if not found 4881 sub di,bx 4882 dec di 4883 clc 4884 CC_end: pop es cx bx ax 4885 ret 4886 4887 4888 4889 MainCommands db '***',0 4890 db 'a',0 4891 db 'x',0 4892 db 'y',0 4893 db 's',0 4894 db 'p',0 4895 db 'pc',0 4896 db 'regs',0 4897 db 'asm',0 4898 db 'ea',0 4899 db 'eb',0 4900 db 'd',0 4901 db 'da',0 4902 db 'db',0 4903 db '[',0 4904 db 'find',0 4905 db 'copy',0 4906 db 'compare',0 4907 db 'break',0 4908 db 'go',0 4909 Com_LLabels db 'll',0 4910 Com_SLabels db 'sl',0 4911 db '.',0 4912 db 'list',0 4913 db 'dl',0 4914 db 'labels',0 ; ON / OFF 4915 db 'swap',0 ; ON / OFF 4916 db '?',0 4917 db 'reset',0 4918 db 'movhlp',0 4919 db 'pdump',0 4920 db 'pasm',0 4921 db 'sound',0 4922 db 'record',0 4923 db 'stop',0 4924 db 'play',0 4925 Com_LRecord db 'lm',0 4926 Com_SRecord db 'sm' 4927 ENDScan1 db 0 4928 4929 AsmInstr db '***',0 4930 db 'lda',0 4931 db 'ldx',0 4932 db 'ldy',0 4933 db 'sta',0 4934 db 'stx',0 4935 db 'sty',0 4936 db 'tax',0 4937 db 'tay',0 4938 db 'tsx',0 4939 db 'txa',0 4940 db 'txs',0 4941 db 'tya',0 4942 db 'pha',0 4943 db 'php',0 4944 db 'pla',0 4945 db 'plp',0 4946 db 'adc',0 4947 db 'sbc',0 4948 db 'inc',0 4949 db 'inx',0 4950 db 'iny',0 4951 db 'dec',0 4952 db 'dex',0 4953 db 'dey',0 4954 db 'and',0 4955 db 'ora',0 4956 db 'eor',0 4957 db 'asl',0 4958 db 'lsr',0 4959 db 'rol',0 4960 db 'ror',0 4961 db 'cmp',0 4962 db 'cpx',0 4963 db 'cpy',0 4964 db 'bit',0 4965 db 'bcc',0 4966 db 'bcs',0 4967 db 'beq',0 4968 db 'bmi',0 4969 db 'bne',0 4970 db 'bpl',0 4971 db 'bvc',0 4972 db 'bvs',0 4973 db 'bra',0 4974 db 'jmp',0 4975 db 'jsr',0 4976 db 'rts',0 4977 db 'rti',0 4978 db 'brk',0 4979 db 'nop',0 4980 db 'clc',0 4981 db 'cld',0 4982 db 'cli',0 4983 db 'clv',0 4984 db 'sec',0 4985 db 'sed',0 4986 db 'sei',0 4987 db 'tsb',0 4988 db 'trb',0 4989 db 'phy',0 4990 db 'phx',0 4991 db 'ply',0 4992 db 'plx',0 4993 db 'stz' 4994 ENDScan2 db 0 4995 4996 ; ******************************************************************* 4997 ; ** ** 4998 ; ** ** 4999 ; ** A P P L E R I N T E R F A C E ** 5000 ; ** ** 5001 ; ** ** 5002 ; ******************************************************************* 5003 5004 MSS_keys db 'gth12fm ' 5005 MSS_subrt dw MSS_Graph, MSS_Text, MSS_HiGr, MSS_p1, MSS_p2 5006 dw MSS_NoMix, MSS_Mix, MSS_Default 5007 5008 MySetScreen: push ax cx di es 5009 mov di,offset MSS_keys 5010 mov cx,offset MSS_subrt - offset MSS_keys 5011 call CalcCommand 5012 jc MSS_ret 5013 mov ax,seg C050 5014 mov es,ax 5015 shl di,1 5016 mov al,C050 5017 mov ah,al 5018 call cs:MSS_Subrt[di] 5019 cmp al,ah 5020 je MSS_ret 5021 ScreenIOservice _SetScreen 5022 mov C050,al 5023 MSS_ret: pop es di cx ax 5024 ret 5025 MSS_Graph: and al,11110110b 5026 ret 5027 MSS_Text: or al,00000001b 5028 ret 5029 MSS_HiGr: or al,00001000b 5030 and al,11111110b 5031 ret 5032 MSS_p1: and al,11111011b 5033 ret 5034 MSS_p2: or al,00000100b 5035 ret 5036 MSS_NoMix: and al,11111101b 5037 ret 5038 MSS_Mix: or al,00000010b 5039 ret 5040 MSS_Default: mov al,cs:OldC050 5041 ret 5042 5043 5044 5045 DebugInit: mov ax,Apple 5046 mov ds,ax 5047 call InitGetLine 5048 cmp byte ptr cs:F1_or_Invalid?,0 5049 jz DI_NoInvalid 5050 mov cs:GetKeyParams.RK_ErrPtr, offset InvalidOpcode 5051 DI_NoInvalid: mov ax,cs:Regs.PC 5052 mov cs:AssembAdr,ax 5053 call ShowPrevIns 5054 call InitBufferA 5055 call InitBufferB 5056 ret 5057 5058 InitGetLine: push cx 5059 mov cs:GetLineParams.GL_Color, 0Bh 5060 mov cs:GetLineParams.GL_OverCurColor,40h 5061 mov cs:GetLineParams.GL_InsCurColor, 20h 5062 mov cs:GetLineParams.GL_MaxPrint, 32 5063 mov cs:GetLineParams.GL_MaxLength, 99 5064 gotoxy 17,2 5065 mov cs:GetLineParams.GL_CX,cx 5066 pop cx 5067 ret 5068 5069 5070 5071 assume ds:Apple,es:TaskControl 5072 GetRegisters proc near 5073 push ax es 5074 mov ax,TaskControl 5075 mov es,ax 5076 mov al,es:r_A 5077 mov cs:Regs.A,al 5078 mov al,es:r_X 5079 mov cs:Regs.X,al 5080 mov al,es:r_Y 5081 mov cs:Regs.Y,al 5082 mov al,es:r_S 5083 mov cs:Regs.S,al 5084 mov al,es:r_P 5085 mov cs:Regs.P,al 5086 mov ax,es:r_PC 5087 mov cs:Regs.PC,ax 5088 pop es ax 5089 ret 5090 GetRegisters endp 5091 5092 SetRegisters proc near 5093 push ax es 5094 mov ax,TaskControl 5095 mov es,ax 5096 mov al,cs:Regs.A 5097 mov es:r_A,al 5098 mov al,cs:Regs.X 5099 mov es:r_X,al 5100 mov al,cs:Regs.Y 5101 mov es:r_Y,al 5102 mov al,cs:Regs.S 5103 mov es:r_S,al 5104 mov al,cs:Regs.P 5105 mov es:r_P,al 5106 mov ax,cs:Regs.PC 5107 mov es:r_PC,ax 5108 pop es ax 5109 ret 5110 SetRegisters endp 5111 5112 5113 SwapTime dw 9 5114 assume es:Emulate 5115 5116 GoAppleII0: push ax 5117 xor ax,ax 5118 xchg ax,cs:SwapTime 5119 call GoAppleII 5120 mov cs:SwapTime,ax 5121 pop ax 5122 ret 5123 5124 GoAppleII: push ax bx cx dx es 5125 call InitBufferA 5126 call InitBufferB 5127 mov cx,seg C050 5128 mov es,cx 5129 xor ax,ax 5130 xchg cs:ActiveFlags,ax 5131 mov cs:GetKeyParams.RK_ErrPtr, offset ExecutingMes 5132 call ShowAll 5133 ScreenIOService _SHOWSCREEN 5134 mov cs:ActiveFlags,ax 5135 mov al,0C3h 5136 xchg al,es:synchro_push_ax 5137 mov cs:old_synchro,al 5138 push es 5139 mov ax,TaskControl 5140 mov es,ax 5141 assume es:TaskControl 5142 mov es:T_Iflags,00000001b 5143 SwitchToProcess PID_EMULATOR 5144 mov es:T_Iflags,00000010b 5145 pop es 5146 assume es:Emulate 5147 mov al,cs:old_synchro 5148 mov es:synchro_push_ax,al 5149 mov ax,cs:SwapTime 5150 call ScreenSwapReq 5151 call SetBreaks 5152 cli 5153 SwitchToProcess PID_EMULATOR 5154 mov cs:GetKeyParams.RK_ErrPtr,0 5155 call CheckBreaks 5156 jnc GAII_NoInvalid 5157 cmp cs:F1_or_Invalid?,0 5158 jz GAII_NoInvalid 5159 mov cs:GetKeyParams.RK_ErrPtr, offset InvalidOpcode 5160 GAII_NoInvalid: mov ax,cs:Regs.PC 5161 mov cs:AssembAdr,ax 5162 call BuffDisasm 5163 call ShowPrevIns 5164 mov al,1 5165 mov cs:RE_FirstTime?,al 5166 mov cs:EA_Params.EB_FirstFl,al 5167 mov cs:EB_Params.EB_FirstFl,al 5168 pop es dx cx bx ax 5169 sti 5170 ret 5171 5172 5173 5174 old_synchro db ? 5175 StepAppleII: call InitBufferA 5176 call InitBufferB 5177 StepAppleII_: push ax 5178 mov al,0C3h 5179 xchg al,es:synchro_push_ax 5180 mov cs:old_synchro,al 5181 push bx es 5182 mov ax,TaskControl 5183 mov es,ax 5184 assume es:TaskControl 5185 mov es:T_Iflags,00000001b 5186 mov bx,cs:Regs.PC 5187 SwitchToProcess PID_EMULATOR 5188 mov cs:ShowPrev?,1 5189 mov cs:PrevAdr,bx 5190 mov ax,cs:Regs.PC 5191 mov cs:AssembAdr,ax 5192 call BuffDisasm 5193 pop es bx 5194 assume es:Emulate 5195 mov al,cs:old_synchro 5196 mov es:synchro_push_ax,al 5197 pop ax 5198 ret 5199 5200 5201 5202 GL_UserCommands db 7,8,3,4 5203 GL_UserSubrt dw UP,DOWN,GL_PgUp,GL_PgDn 5204 GetLineUser proc far 5205 push bx cx di bp ds 5206 mov di,Apple 5207 mov ds,di 5208 mov di,offset GL_UserCommands 5209 mov cx,offset GL_UserSubrt- offset GL_UserCommands 5210 call CalcCommand 5211 jc GLU_Ret 5212 shl di,1 5213 call GL_UserSubrt[di] 5214 GLU_Ret: pop ds bp di cx bx 5215 ret 5216 GetLineUser endp 5217 5218 GL_PgUp: push bx 5219 mov bx,09h 5220 GL_PU_loop: call UP 5221 dec bx 5222 jnz GL_PU_loop 5223 pop bx 5224 clc 5225 ret 5226 5227 GL_PgDn: push bx 5228 mov bx,09h 5229 GL_PD_loop: call DOWN 5230 dec bx 5231 jnz GL_PD_loop 5232 pop bx 5233 clc 5234 ret 5235 5236 5237 5238 ; ******************************************************************* 5239 ; ** ** 5240 ; ** ** 5241 ; ** T A B L E S ** 5242 ; ** ** 5243 ; ** ** 5244 ; ******************************************************************* 5245 5246 ; 0 1 2 3 4 5 6 7 8 9 A B C D E F 5247 InstrTable db 'BRKORA??????TSBORAASL???PHPORAASL???TSBORAASL???' ;00 5248 db 'BPLORAORA???TRBORAASL???CLCORAINC???TRBORAASL???' ;10 5249 db 'JSRAND??????BITANDROL???PLPANDROL???BITANDROL???' ;20 5250 db 'BMIANDAND???BITANDROL???SECANDDEC???BITANDROL???' ;30 5251 db 'RTIEOR?????????EORLSR???PHAEORLSR???JMPEORLSR???' ;40 5252 db 'BVCEOREOR??????EORLSR???CLIEORPHY??????EORLSR???' ;50 5253 db 'RTSADC??????STZADCROR???PLAADCROR???JMPADCROR???' ;60 5254 db 'BVSADCADC???STZADCROR???SEIADCPLY???JMPADCROR???' ;70 5255 db 'BRASTA??????STYSTASTX???DEYBITTXA???STYSTASTX???' ;80 5256 db 'BCCSTASTA???STYSTASTX???TYASTATXS???STZSTASTZ???' ;90 5257 db 'LDYLDALDX???LDYLDALDX???TAYLDATAX???LDYLDALDX???' ;A0 5258 db 'BCSLDALDA???LDYLDALDX???CLVLDATSX???LDYLDALDX???' ;B0 5259 db 'CPYCMP??????CPYCMPDEC???INYCMPDEX???CPYCMPDEC???' ;C0 5260 db 'BNECMPCMP??????CMPDEC???CLDCMPPHX??????CMPDEC???' ;D0 5261 db 'CPXSBC??????CPXSBCINC???INXSBCNOP???CPXSBCINC???' ;E0 5262 db 'BEQSBCSBC??????SBCINC???SEDSBCPLX??????SBCINC???' ;F0 5263 5264 5265 5266 ; 0 1 2 3 4 5 6 7 8 9 A B C D E F 5267 InstrLongTbl db 82h,2,5,5,2,2,2,5,1,2,1,5, 3 ,3,3,5 ;00 5268 db 82h,2,2,5,2,2,2,5,1,3,1,5, 3 ,3,3,5 ;10 5269 db 83h,2,5,5,2,2,2,5,1,2,1,5, 3 ,3,3,5 ;20 5270 db 82h,2,2,5,2,2,2,5,1,3,1,5, 3 ,3,3,5 ;30 5271 db 1,2,5,5,5,2,2,5,1,2,1,5,83h,3,3,5 ;40 5272 db 82h,2,2,5,5,2,2,5,1,3,1,5, 5 ,3,3,5 ;50 5273 db 1,2,5,5,2,2,2,5,1,2,1,5,83h,3,3,5 ;60 5274 db 82h,2,2,5,2,2,2,5,1,3,1,5,83h,3,3,5 ;70 5275 db 82h,2,5,5,2,2,2,5,1,2,1,5, 3 ,3,3,5 ;80 5276 db 82h,2,2,5,2,2,2,5,1,3,1,5, 3 ,3,3,5 ;90 5277 db 2,2,2,5,2,2,2,5,1,2,1,5, 3 ,3,3,5 ;A0 5278 db 82h,2,2,5,2,2,2,5,1,3,1,5, 3 ,3,3,5 ;B0 5279 db 2,2,5,5,2,2,2,5,1,2,1,5, 3 ,3,3,5 ;C0 5280 db 82h,2,2,5,5,2,2,5,1,3,1,5, 5 ,3,3,5 ;D0 5281 db 2,2,5,5,2,2,2,5,1,2,1,5, 3 ,3,3,5 ;E0 5282 db 82h,2,2,5,5,2,2,5,1,3,1,5, 5 ,3,3,5 ;F0 5283 5284 5285 5286 ; ??? 0 5287 ; # 1 5288 ; ZP 2 5289 ; ZP,X 3 5290 ; Full 4 5291 ; Full,X 5 5292 ; Full,Y 6 5293 ; (ZP,X) 7 5294 ; (ZP),Y 8 5295 ; ZP,Y 9 5296 ; JMP A 5297 ; JMP () B 5298 ; NoOper C 5299 ; BEQ D 5300 ; (ZP) E 5301 ; (....,X) F 5302 5303 5304 ; 0 1 2 3 4 5 6 7 8 9 A B C D E F 5305 ParamTable db 1, 7, 0, 0, 2, 2, 2, 0,12, 1,12, 0, 4, 4, 4, 0 ; 00 5306 db 13, 8,14, 0, 2, 3, 3, 0,12, 6,12, 0, 4, 5, 5, 0 ; 10 5307 db 10, 7, 0, 0, 2, 2, 2, 0,12, 1,12, 0, 4, 4, 4, 0 ; 20 5308 db 13, 8,14, 0, 3, 3, 3, 0,12, 6,12, 0, 5, 5, 5, 0 ; 30 5309 db 12, 7, 0, 0, 0, 2, 2, 0,12, 1,12, 0,10, 4, 4, 0 ; 40 5310 db 13, 8,14, 0, 0, 3, 3, 0,12, 6,12, 0, 0, 5, 5, 0 ; 50 5311 db 12, 7, 0, 0, 2, 2, 2, 0,12, 1,12, 0,11, 4, 4, 0 ; 60 5312 db 13, 8,14, 0, 3, 3, 3, 0,12, 6,12, 0,15, 5, 5, 0 ; 70 5313 db 13, 7, 0, 0, 2, 2, 2, 0,12, 1,12, 0, 4, 4, 4, 0 ; 80 5314 db 13, 8,14, 0, 3, 3, 9, 0,12, 6,12, 0, 4, 5, 5, 0 ; 90 5315 db 1, 7, 1, 0, 2, 2, 2, 0,12, 1,12, 0, 4, 4, 4, 0 ; A0 5316 db 13, 8,14, 0, 3, 3, 9, 0,12, 6,12, 0, 5, 5, 6, 0 ; B0 5317 db 1, 7, 0, 0, 2, 2, 2, 0,12, 1,12, 0, 4, 4, 4, 0 ; C0 5318 db 13, 8,14, 0, 0, 3, 3, 0,12, 6,12, 0, 0, 5, 5, 0 ; D0 5319 db 1, 7, 0, 0, 2, 2, 2, 0,12, 1,12, 0, 4, 4, 4, 0 ; E0 5320 db 13, 8,14, 0, 0, 3, 3, 0,12, 6,12, 0, 0, 5, 5, 0 ; F0 5321 5322 5323 5324 ; NoOp #$ $. $.X $.Y $.. $..X $..Y (X) ()Y () (....,X) 5325 AsmTab1 db 0FFh,0A9h,0A5h,0B5h,0FFh,0ADh,0BDh,0B9h,0A1h,0B1h,0B2h,0FFh ;LDA 5326 db 0FFh,0A2h,0A6h,0FFh,0B6h,0AEh,0FFh,0BEh,0FFh,0FFh,0FFh,0FFh ;LDX 5327 db 0FFh,0A0h,0A4h,0B4h,0FFh,0ACh,0BCh,0FFh,0FFh,0FFh,0FFh,0FFh ;LDY 5328 db 0FFh,0FFh,085h,095h,0FFh,08Dh,09Dh,099h,081h,091h,092h,0FFh ;STA 5329 db 0FFh,0FFh,086h,0FFh,096h,08Eh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;STX 5330 db 0FFh,0FFh,084h,094h,0FFh,08Ch,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;STY 5331 db 0AAh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;TAX 5332 db 0A8h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;TAY 5333 db 0BAh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;TSX 5334 db 08Ah,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;TXA 5335 db 09Ah,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;TXS 5336 db 098h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;TYA 5337 db 048h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;PHA 5338 db 008h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;PHP 5339 db 068h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;PLA 5340 db 028h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;PLP 5341 db 0FFh,069h,065h,075h,0FFh,06Dh,07Dh,079h,061h,071h,072h,0FFh ;ADC 5342 db 0FFh,0E9h,0E5h,0F5h,0FFh,0EDh,0FDh,0F9h,0E1h,0F1h,0F2h,0FFh ;SBC 5343 db 01Ah,0FFh,0E6h,0F6h,0FFh,0EEh,0FEh,0FFh,0FFh,0FFh,0FFh,0FFh ;INC 5344 db 0E8h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;INX 5345 db 0C8h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;INY 5346 db 03Ah,0FFh,0C6h,0D6h,0FFh,0CEh,0DEh,0FFh,0FFh,0FFh,0FFh,0FFh ;DEC 5347 db 0CAh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;DEX 5348 db 088h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;DEY 5349 db 0FFh,029h,025h,035h,0FFh,02Dh,03Dh,039h,021h,031h,032h,0FFh ;AND 5350 db 0FFh,009h,005h,015h,0FFh,00Dh,01Dh,019h,001h,011h,012h,0FFh ;ORA 5351 db 0FFh,049h,045h,055h,0FFh,04Dh,05Dh,059h,041h,051h,052h,0FFh ;EOR 5352 db 00Ah,0FFh,006h,016h,0FFh,00Eh,01Eh,0FFh,0FFh,0FFh,0FFh,0FFh ;ASL 5353 db 04Ah,0FFh,046h,056h,0FFh,04Eh,05Eh,0FFh,0FFh,0FFh,0FFh,0FFh ;LSR 5354 db 02Ah,0FFh,026h,036h,0FFh,02Eh,03Eh,0FFh,0FFh,0FFh,0FFh,0FFh ;ROL 5355 db 06Ah,0FFh,066h,076h,0FFh,06Eh,07Eh,0FFh,0FFh,0FFh,0FFh,0FFh ;ROR 5356 db 0FFh,0C9h,0C5h,0D5h,0FFh,0CDh,0DDh,0D9h,0C1h,0D1h,0D2h,0FFh ;CMP 5357 db 0FFh,0E0h,0E4h,0FFh,0FFh,0ECh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;CPX 5358 db 0FFh,0C0h,0C4h,0FFh,0FFh,0CCh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;CPY 5359 db 0FFh,089h,024h,034h,0FFh,02Ch,03Ch,0FFh,0FFh,0FFh,0FFh,0FFh ;BIT 5360 db 0FFh,0FFh,0FFh,0FFh,0FFh,090h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BCC 5361 db 0FFh,0FFh,0FFh,0FFh,0FFh,0B0h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BCS 5362 db 0FFh,0FFh,0FFh,0FFh,0FFh,0F0h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BEQ 5363 db 0FFh,0FFh,0FFh,0FFh,0FFh,030h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BMI 5364 db 0FFh,0FFh,0FFh,0FFh,0FFh,0D0h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BNE 5365 db 0FFh,0FFh,0FFh,0FFh,0FFh,010h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BPL 5366 db 0FFh,0FFh,0FFh,0FFh,0FFh,050h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BVC 5367 db 0FFh,0FFh,0FFh,0FFh,0FFh,070h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BVS 5368 db 0FFh,0FFh,0FFh,0FFh,0FFh,080h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BRA 5369 db 0FFh,0FFh,0FFh,0FFh,0FFh,04Ch,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;JMP 5370 db 0FFh,0FFh,0FFh,0FFh,0FFh,020h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;JSR 5371 db 060h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;RTS 5372 db 040h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;RTI 5373 db 0FFh,000h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;BRK 5374 db 0EAh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;NOP 5375 db 018h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;CLC 5376 db 0D8h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;CLD 5377 db 058h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;CLI 5378 db 0B8h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;CLV 5379 db 038h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;SEC 5380 db 0F8h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;SED 5381 db 078h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;SEI 5382 db 0FFh,0FFh,004h,0FFh,0FFh,00Ch,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;TSB 5383 db 0FFh,0FFh,014h,0FFh,0FFh,01Ch,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;TRB 5384 db 05Ah,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;PHY 5385 db 0DAh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;PHX 5386 db 07Ah,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;PLY 5387 db 0FAh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh ;PLX 5388 db 0FFh,0FFh,064h,074h,0FFh,09Ch,09Eh,0FFh,0FFh,0FFh,0FFh,0FFh ;STZ 5389 5390 Debug ends 5391 5392 END