Print itself: Difference between revisions

m
→‎{{header|Z80 Assembly}}: displayed bytecode alongside assembly
m (added output and fixed formatting)
m (→‎{{header|Z80 Assembly}}: displayed bytecode alongside assembly)
Line 176:
=={{header|Z80 Assembly}}==
This program prints its bytecode as text to the Amstrad CPC terminal. The program is run by typing <code>call &1000</code> to the screen.
<pre>WinAPE Z80 Assembler V1.0.13
<lang z80>org &1001
 
ld000001 hl,& 0000 (1001) ;&1000 won't work since that contains org &00.1001
000003 1001 21 01 10 ld hl,&1001
000004 1004 1E FF ld e,&ff ;&000 is the terminator so we can't use zero as an immediate directly
000005 1006 1C inc e ;Mustwe have to abuse 8-bit underflow to get it.
loop:
000006 1007 loop
ld a,(hl)
000007 1007 7E ld a,(hl)
cp e
000008 1008 BB cp e
jp z,ProgramEnd
000009 1009 CA 2B 10 jp z,ProgramEnd
 
000011 100C CD 36 10 call UnpackNibbles
000012 100F 78 ld a,b
ld a,b
000013 1010 FE 0A cp &0A
cp &0A
000014 1012 38 02 jr c,noCorrectHex_B
000015 1014 C6 07 add &07
add &07
000016 1016 noCorrectHex_B:
000017 1016 C6 30 add &30
add &30
000018 1018 CD 5A BB call &bb5a
000020 101B 79 ld a,c
 
000021 101C FE 0A cp &0A
ld a,c
000022 101E 38 02 jr c,noCorrectHex_C
cp &0A
000023 1020 C6 07 add &07
jr c,noCorrectHex_C
000024 1022 noCorrectHex_C
add &07
000025 1022 C6 30 add &30
noCorrectHex_C:
000026 1024 CD 5A BB call &bb5a
add &30
000027 1027 23 inc hl
call &bb5a
000028 1028 C3 07 10 jp loop
inc hl
000029 102B ProgramEnd
jp loop
000030 102B 3E 30 ld a,&30
ProgramEnd:
000031 102D CD 5A BB call &bb5a
ld a,&30
000032 1030 3E 30 ld a,&30
call &bb5a
000033 1032 CD 5A BB call &bb5a
ld a,&30
000034 1035 C9 ret ;return to basic
call &bb5a
000037 1036 UnpackNibbles
ret ;return to basic
000038 1036 ;splits a into its component nibbles, storing high nibble in B and low in C.
 
000039 1036 F5 push af
 
000040 1037 E6 0F and &0f
UnpackNibbles:
000041 1039 4F ld c,a
;splits a into its component nibbles, storing high nibble in B and low in C.
000042 103A F1 pop af
push af
000043 103B E6 F0 and &f0
and &0f
000044 103D 0F rrca
ld c,a
000045 103E 0F rrca
pop af
000046 103F 0F rrca
and &f0
000047 1040 0F rrca
rrca
000048 1041 47 ld b,a
rrca
000049 1042 C9 ret
rrca
000051 1043 00 db 0 ;this must be the only instance of 00 in the bytecode for this to work.
rrca
</pre>
ld b,a
ret
 
db 0 ;null terminator. No instructions or operands above compile to &00. </lang>
{{out}}
[https://ibb.co/KbzjpNQ Output on WinAPE]
1,489

edits