Raw File
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 <GetLineBuf,0,0,0,0,0,0,2,4,0,?,?,0,1,1,GetLineUser,?,?,?,?>
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,'<Enter> 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,'<Enter> 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,'<Enter> 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,'<Enter> 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 '<reg> =<value>',1,7,' -change register',0
3787 db ' ',0
3788 db 'D <addr>',1,7,' -disassemble',0
3789 db 'DA <addr>',1,7,' -dump A',0
3790 db 'DB <addr>',1,7,' -dump B',0
3791 db 'ASM [<addr>]',1,7,' -assembler mode',0
3792 db 'EA [<addr>]',1,7,' -edit dump A',0
3793 db 'EB [<addr>]',1,7,' -edit dump B',0
3794 db ' ',0
3795 db '[ <beg>,<end>]',1,7,' -set {margins}',0
3796 db 'FIND [<byte>,..][''st'',..]["st",..]',0
3797 db 1,7,' -find string in {margins}',0
3798 db 'COPY <addr>',1,7,' -copy {margins}',0
3799 db 'COMP <addr>',1,7,' -compare {margins}',0
3800 db 'PDUMP [<FileName>]',0
3801 db 1,7,' -Print Memory Dump',0
3802 db 'PASM [<FileName>]',0
3803 db 1,7,' -Print Disassembled Dump',0
3804 db ' ',0
3805 db 'BREAK<1..6>=<addr>',1,7,' -set breakpoint',0
3806 db 'GO [<start>][,<stop>]',1,7,' -execute',0
3807 db ' ',0
3808 db '. <Identifier>=<addr>',0
3809 db 1,7,' -define label',0
3810 db 'LIST',1,7,' -defined labels list',0
3811 db 'DL <identifier>',1,7,' -delete label',0
3812 db 'LAB <ON>|<OFF>',1,7,' -labels activity',0
3813 db 'LL <FileName>',1,7,' -load labels',0
3814 db 'SL <FileName>',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 [<FileName>]',1,7,' -play macro',0
3820 db 'LM <FileName>',1,7,' -load macro',0
3821 db 'SM <FileName>',1,7,' -save macro',0
3822 db ' ',0
3823
3824 db '? <expression>[,h][,d][,b]',0
3825 db 1,7,' -evaluate expression',0
3826 db 'SWAP <TimerTicks>',1,7,' -scr swapping',0
3827 db 'SOUND <ON>|<OFF>',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 <addr>',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 <addr>',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
5393
Generated by GNU Enscript 1.6.6, and GophHub 1.3.