This repository was archived by the owner on Feb 10, 2025. It is now read-only.
forked from jblang/bbcbasic-z80
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtracing.asm
201 lines (175 loc) · 2.73 KB
/
tracing.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
BDOS EQU 5
#include "tracing.inc"
#ifdef TRACING
PUBLIC PRTSTRZ, NEWLINE, PRTCHR
PUBLIC PRTSTRD
PUBLIC PRT_HLHLC, PRT_DEDEB
PUBLIC PRTHEXWORDHL, PRTHEXWORDIX, PRTHEXWORDDE
PUBLIC PRTHEX, PRTHEX_D, PRTHEX_C, PRTHEX_B
PUBLIC PRTDEC_HL, PRTDEC_DE
EXTERN STR, PTEXT, SWAP, PRTHL
PRTSTRD:
EX (SP),HL
PUSH AF
CALL PRTSTRZ
POP AF
EX (SP),HL
RET
;===============================================================================
; PRINT A $ TERMINATED STRING AT (HL) WITHOUT DESTROYING ANY REGISTERS
PRTSTRZ:
LD A, (HL) ; GET NEXT CHAR
INC HL
CP '$'
RET Z
CALL PRTCHR
JR PRTSTRZ
;
; PRINT THE HEX WORD VALUE IN HL
;
PRTHEXWORDHL:
PUSH AF
LD A,H
CALL PRTHEX
LD A,L
CALL PRTHEX
POP AF
RET
PRTHEXWORDDE:
PUSH HL
PUSH DE
PUSH DE
POP HL
CALL PRTHEXWORDHL
POP DE
POP HL
RET
PRTHEXWORDBC:
PUSH HL
PUSH BC
PUSH BC
POP HL
CALL PRTHEXWORDHL
POP BC
POP HL
RET
PRTHEXWORDIX:
PUSH HL
PUSH IX
POP HL
CALL PRTHEXWORDHL
POP HL
RET
PRTCHR:
PUSH AF
PUSH IY
PUSH BC ; SAVE REGISTERS
PUSH DE
PUSH HL
LD E, A ; CHARACTER TO PRINT IN E
LD C, $02 ; BDOS FUNCTION TO OUTPUT A CHARACTER
CALL BDOS ; DO IT
POP HL ; RESTORE REGISTERS
POP DE
POP BC
POP IY
POP AF
RET
PRTHEX:
PUSH AF ; SAVE AF
PUSH DE ; SAVE DE
CALL HEXASCII ; CONVERT VALUE IN A TO HEX CHARS IN DE
LD A, D ; GET THE HIGH ORDER HEX CHAR
CALL PRTCHR ; PRINT IT
LD A, E ; GET THE LOW ORDER HEX CHAR
CALL PRTCHR ; PRINT IT
POP DE ; RESTORE DE
POP AF ; RESTORE AF
RET ; DONE
HEXASCII:
LD D, A ; SAVE A IN D
CALL HEXCONV ; CONVERT LOW NIBBLE OF A TO HEX
LD E, A ; SAVE IT IN E
LD A, D ; GET ORIGINAL VALUE BACK
RLCA ; ROTATE HIGH ORDER NIBBLE TO LOW BITS
RLCA
RLCA
RLCA
CALL HEXCONV ; CONVERT NIBBLE
LD D, A ; SAVE IT IN D
RET ; DONE
;===============================================================================
; CONVERT LOW NIBBLE OF A TO ASCII HEX
HEXCONV:
AND $0F ; LOW NIBBLE ONLY
ADD A, $90
DAA
ADC A, $40
DAA
RET
;===============================================================================
; START A NEW LINE
NEWLINE:
PUSH AF
LD A, 13 ; <CR>
CALL PRTCHR ; PRINT IT
LD A, 10 ; <LF>
CALL PRTCHR ; PRINT IT
POP AF
RET
PRTHEX_D: PUSH AF
LD A, D
CALL PRTHEX_D
POP AF
RET
PRTHEX_C: PUSH AF
LD A, C
CALL PRTHEX
POP AF
RET
PRTHEX_B: PUSH AF
LD A, B
CALL PRTHEX
POP AF
RET
PRT_DEDEB: CALL SWAP
CALL PRT_HLHLC
CALL SWAP
RET
PRTDEC_HL:
PUSH HL
PUSH DE
CALL PRTHL
POP DE
POP HL
RET
PRTDEC_DE:
PUSH HL
PUSH DE
PUSH DE
POP HL
CALL PRTHL
POP DE
POP HL
RET
PRT_HLHLC:
PUSH HL
PUSH DE
PUSH BC
EXX
PUSH HL
PUSH DE
PUSH BC
EXX
CALL STR
CALL PTEXT
EXX
POP BC
POP DE
POP HL
EXX
POP BC
POP DE
POP HL
RET
#endif ; IFDEF TRACING